标签: c++

Android NDK STL c ++ _ shared w/LIBCXX_FORCE_REBUILD导致std :: stringstream NOP

tl; dr:这个问题是为了解释为什么std::stringstream"失败",以及为什么它在链接到重建的c ++ _共享库时失败的方式(通过简单地什么都不做).

一个最小的例子:

std::stringstream ss;
ss << "Hello World";
__android_log_print(ANDROID_LOG_INFO,
                   "APP",
                   "Length: %i", ss.str().size());
Run Code Online (Sandbox Code Playgroud)

使用时编译项目

APP_STL := c++_shared
LIBCXX_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)

输出是Length: 0.当使用APP_STL := c++_staticLIBCXX_FORCE_REBUILD := false,stringstream按预期工作时,Length: 11作为输出.

我正在使用STL的很多部分,到目前为止我看到的唯一明显的区别是这个沉默NOP stringstream.我还通过修改libgl2jniNDK示例测试了这一点,将Application.mk文件添加为:

NDK_TOOLCHAIN_VERSION := 4.8
APP_OPTIM := release
APP_STL := c++_shared
APP_ABI := armeabi-v7a #armeabi-v7a x86
APP_PLATFORM := android-19
LIBCXX_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)

我已经测试了APP_OPTIM作为发布/调试的各种排列,APP_STL如c ++ _ shared/c ++ _ static,以及 …

c++ android stl android-ndk

24
推荐指数
1
解决办法
7091
查看次数

shrink_to_fit是减少`std :: vector`到其大小的容量的正确方法吗?

在C++ 11 shrink_to_fit是引入补充某些STL容器(例如,std::vector,std::deque,std::string).

Synopsizing,其主要功能是请求与之关联的容器,以减少其容量以适应其大小.但是,此请求是非绑定的,并且容器实现可以自由地进行优化,并使向量的容量大于其大小.

此外,在之前的SO问题中,OP不鼓励使用它shrink_to_fit来减小其容量std::vector.不这样做的理由如下:

shrink_to_fit什么都不做,或者它给你缓存局部性问题,并且执行O(n)(因为你必须将每个项目复制到他们新的较小的家庭).通常,将松弛留在内存中会更便宜.@Massa

有人可以如此善意地解决以下问题:

  • 报价中的参数是否成立?
  • 如果是的话,将STL容器的容量缩小到适当大小的正确方法什么(至少对于std::vector).
  • 如果有更好的方法来缩小容器,那么后续存在的原因是什么shrink_to_fit

c++ stl vector c++11

24
推荐指数
2
解决办法
1万
查看次数

为什么Malloc()关心边界对齐?

我听说malloc()根据正在分配的类型来调整内存.例如,从" 理解和使用C指针 "一书中:

分配的内存将根据指针的数据类型进行对齐.例如,一个四字节整数将分配在一个可被4整除的地址边界上.

如果我遵循,这意味着 int *integer=malloc(sizeof(int));将分配在一个可被4整除的地址边界上.即使没有(int *)在malloc上施放.

我在聊天服务器上工作; 我读到了与s 类似的效果struct.

我不得不问:从逻辑上讲,为什么地址边界本身可以被整除呢?将一组内存分配到n*sizeof(int)地址上使用整数的调整有129什么问题?

我知道指针算法是如何工作的*(integer+1),但我无法弄清楚边界的重要性......

c c++ pointers memory-management

24
推荐指数
3
解决办法
1707
查看次数

为什么C++ 11强类型枚举不能通过指针强制转换为底层类型?

在C++ 11中,我们可以将强类型的枚举(enum class)强制转换为其基础类型.但似乎我们不能指向相同的指针:

enum class MyEnum : int {};

int main()
{
  MyEnum me;

  int iv = static_cast<int>(me); // works
  int* ip = static_cast<int*>(&me); // "invalid static_cast"
}
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么会这样:有什么关于枚举机制的东西让支持这个很难或没有意义吗?这是标准中的简单疏忽吗?别的什么?

在我看来,如果枚举类型真正构建在如上所述的整数类型之上,我们应该不仅能够投射值而且还能投射指针.我们仍然可以使用reinterpret_cast<int*>或者使用C风格的演员表,但这比我认为的更重要.

c++ enums c++11 enum-class strongly-typed-enum

24
推荐指数
4
解决办法
7449
查看次数

是否有必要锁定一个*只从一个线程写入*而*只从*另一个读取?

我有两个线程在运行.他们共享一个阵列.其中一个线程向数组添加新元素(并删除它们),另一个使用此数组(仅限读取操作).在我添加/删除数组或从中读取数组之前,是否有必要锁定数组?

更多详情:

  • 我将需要在另一个线程中继续迭代整个数组.如前所述,那里没有写操作."只需扫描像固定大小的循环缓冲区"
  • 在这种情况下,最简单的方法是使用锁.然而,锁可能非常慢.如果可以避免使用锁,我不想使用锁.此外,从讨论中得出,可能没有必要(实际上不是)锁定阵列上的所有操作.只是锁定数组的迭代器管理(将由另一个线程使用的计数变量)就足够了

我不认为这个问题"过于宽泛".如果仍然如此,请告诉我.我知道这个问题并不完美.为了能够解决问题,我必须至少结合3个答案 - 这表明大多数人无法完全理解所有问题,并被迫做一些猜测工作.但大多数都是通过我试图纳入问题的评论得出的.答案帮助我非常客观地解决了我的问题,我认为这里提供的答案对于从多线程开始的人来说是非常有用的资源.

c c++ arrays multithreading

24
推荐指数
4
解决办法
4163
查看次数

在CMake中强制使用C99(使用'for'循环初始声明)

我一直在寻找一种可移植的方法来强制CMake启用编译器的C99功能,以避免出现以下gcc错误:

error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int s = 1; s <= in_para->StepNumber; s++){
^
Run Code Online (Sandbox Code Playgroud)

我也不想检查哪个编译器并附加如下内容:

set(CMAKE_C_FLAGS "-std=c99") # that would be bad
Run Code Online (Sandbox Code Playgroud)

所以我发现这篇文章:在CMake中启用C99以及相关的功能请求:0012300:CMake没有跨平台的方式来请求C99.在这个Mantis bug中,我了解了target_compiler_features之后我发现了这些SOF答案:如何在CMake中激活C++ 11?以及如何使用CMake检测编译器的C++ 11支持.

所以我的问题是:这target_compiler_features将提供一种需要C功能和C++功能的方法吗?现在最简单的方法是什么 - 我目前正在使用CMake 2.8.12.2.这target_compiler_features不是CMake的最新发行版本(3.0.0).你知道什么时候被释放吗?

c c++ c99 cmake

24
推荐指数
2
解决办法
2万
查看次数

为什么现代C++编译器不能优化这样的简单循环?(Clang,MSVC)

当我使用Clang(-O3)或MSVC(/O2)编译并运行此代码时...

#include <stdio.h>
#include <time.h>

static int const N = 0x8000;

int main()
{
    clock_t const start = clock();
    for (int i = 0; i < N; ++i)
    {
        int a[N];    // Never used outside of this block, but not optimized away
        for (int j = 0; j < N; ++j)
        {
            ++a[j];  // This is undefined behavior (due to possible
                     // signed integer overflow), but Clang doesn't see it
        }
    }
    clock_t const finish = …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang compiler-optimization visual-c++

24
推荐指数
2
解决办法
1854
查看次数

为什么运算符`?:`没有优先权?

调试后我发现三元运算符?:没有优先级.我的问题是为什么?
我有以下代码:

bool T = true;
cout << ((T == true) ? "true" : "false") << endl;
cout << (T == true) ? "true" : "false";
Run Code Online (Sandbox Code Playgroud)

输出:

true
1
Run Code Online (Sandbox Code Playgroud)

现场演示:http://ideone.com/Tkvt9q

c++

24
推荐指数
4
解决办法
2471
查看次数

C和C++中的易失性数组

在C中使用volatile关键字来防止编译器对变量执行某些优化以及其他细微更改.

例如;

volatile int my_int = 0;
Run Code Online (Sandbox Code Playgroud)

创建一个整数.在某些情况下,它可能会阻止以下优化:

while(my_int == 0); // Loop until my_int != 0
Run Code Online (Sandbox Code Playgroud)

优化到:

while(1); // Loop infinity.
Run Code Online (Sandbox Code Playgroud)

这对于包括嵌入式系统中经常遇到的情况很有用,例如可以通过中断函数调用对变量进行修改的情况.还有许多其他这种技术有用的例子.my_int可以是由这种功能修改的标志.(这只是一个玩具模型.)

但是,请考虑函数修改的数据是数组的情况.数据可以由指针指向.

unsigned char* my_data = new unsigned char[256];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,考虑到是my_data在这个问题上的该特定情况的全局变量[1],volatile关键字冗余的,或者它仍需要?

[1]可能无关紧要.

如果答案是需要volatile关键字,那么使用正确的语法是什么?

例如,volatile unsigned char* my_data假设声明指针本身是易失性的,而不是它指向的数据.

最后,C和C++的使用有区别吗?

c c++ arrays embedded volatile

24
推荐指数
1
解决办法
9015
查看次数

将char数组初始化为字符串值,未初始化的索引是否设置为null?

如果我有以下内容:

char test[10] = "#";
Run Code Online (Sandbox Code Playgroud)

test[1]通过test[9]保证\0吗?或者只test[1]保证是\0

c++ initialization declaration

24
推荐指数
1
解决办法
720
查看次数