草庐IT

c++ - std::thread 使用 gcc-linaro-4.9.4 在 Raspbian 中导致段错误

在我看来完全有效的代码中出现了段错误。这是一个最小的重新创建示例:#include#includevoidfunc(){/*donothing;threadcontentsareirrelevant*/}intmain(){for(unsignedidx=0;idx我运行了打印,以检查哪个迭代失败;我在迭代#292时遇到段错误。我使用了gcc-linaro-4.9.4(取自此处:https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/)。我是这样编译程序的:arm

c++ - 为什么 std::seed_seq 根据 C++11 是不可复制的,为什么 gcc/clang 不符合?

考虑以下最小示例://main.cpp#includeintmain(int,char**){std::seed_seqseed1{1337,42};std::seed_seqseed2(seed1);std::seed_seqseed3=seed2;return0;}根据C++标准,这不应该编译,因为std::seed_seq既不是copyconstructible,也不copyassignable.然而,这对g++4.9都编译得很好,和clang3.4g++-4.9-std=c++11-Wallmain.cppclang++-std=c++11-Wallmain.cppandroi

c++ - Variadic 模板代码可在 GCC 4.6 上编译,但不能在 clang 或 GCC 4.7 上编译

我有这段代码(从更复杂的版本简化而来):templateclassTest{public:templatevoidprint(void(*function)(A2...,A1...)){}};voidtest_print(inta,floatb,doublec){}intmain(){Testtest;test.print(&test_print);}如果我在GCC4.6.3上使用g++-std=c++0xfilename.cpp编译它,它编译正常但是在clang3.0上使用clang++-std=c++0xfilename.cpp它抛出以下错误:filename.cpp:14:10:

c++ - gcc 的 __float128 float 是否考虑了当前的舍入模式?

gcc的__float128float的算术运算是否考虑了当前的舍入模式?例如,如果使用C++11函数std::fesetenv,我将舍入模式更改为FE_DOWNWARD,将对进行算术运算的结果__float128向下舍入?这是否由__float128规范保证? 最佳答案 我相信保证__float128上的操作考虑了舍入模式。根据GNUC库文档,浮点计算遵循舍入模式。根据GCC手册__float128是一个支持除法等算术运算的浮点类型。据此我推断,对于__float128的操作,必须考虑舍入模式。GNUC库文档指出:20.6Roun

c++ - Mac gcc 不允许显式调用 std::string::~string

strdata->std::string::~string();这是我得到的错误:error:'~'indestructornameshouldbeafternestednamespecifierstrdata->std::string::~string();^我正在使用cmake项目...我通过brew安装的gcc版本如下:gcc--versionConfiguredwith:--prefix=/Library/Developer/CommandLineTools/usr--with-gxx-include-dir=/usr/include/c++/4.2.1AppleLLVMver

c++ - 为什么 GCC 6 假设数据是 16 字节对齐的?

(很抱歉未能将我的问题简化为一个简单的失败测试用例...)我在升级到GCC6.3.0以构建我们的代码库时遇到了问题(相关标志:-O3-m32)。具体来说,由于GCC优化,我的应用程序在structctor调用中出现段错误。在这个构造函数中,GCC使用了movaps:movaps%xmm0,0x30a0(%ebx)movaps要求操作数16字节对齐。但此时,%ebx指向我的对象,它不一定是16字节对齐。来自glibc:“TheaddressofablockreturnedbymallocorreallocinGNUsystemsisalwaysamultipleofeight(orsix

c++ - gcc-3 二进制文件是否与 gcc-4 兼容

我有一个用gcc3.4.3编译的静态库。我想在现在将用gcc-4编译的代码中使用它。我模糊地读到gcc-3和gcc-4二进制文件不兼容,需要重新编译库,但只是想确认一下。无论如何,gcc-3库是否可以与gcc-4一起使用? 最佳答案 让组织中的其他人或供应商将他们的库更新到gcc4并不总是一种选择,尤其是当他们已经放弃它时。如果是C++:假设能够链接,在运行时你可以在使用流的C++标准库模板代码中爆炸,因为g++4生成的符号根据g++3生成的定义解析。链接时您可能会看到此警告:/usr/bin/ld:警告:libstdc++.so.

c++ - 关于矢量化和循环大小的令人费解的 GCC 行为

最初调查#pragmaompsimd指令的效果时,我遇到了一个我无法解释的行为,它与简单for循环的矢量化有关。可以在这个很棒的compilerexplorer上测试以下代码示例,前提是应用了-O3指令并且我们在x86架构上。有人可以向我解释以下观察结果背后的逻辑吗?#includevoidtest(uint8_t*out,uint8_tconst*in,uint32_tlength){unsignedconstl1=(length*32)/32;//Thisisvectorizedunsignedconstl2=(length/32)*32;//Thisisnotvectorized

c++ - 用 GCC 编译时还需要使用 -fPIC 吗?

在gcc目标机器上,当一个人想要编译一个共享库时,需要指定-fpic或-fPIC才能使事情正常工作。这是因为默认情况下使用绝对寻址,这适用于对自己的地址空间具有完全控制权的可执行文件,但不适用于可以加载到可执行文件地址空间中任何位置的共享库。然而,现代内核现在正在实现地址空间随机化,并且许多现代架构都支持PC相对寻址。这一切似乎都使绝对寻址变得不可用(地址空间随机化)或不需要(PC相对寻址)。我还注意到clang没有-fPIC选项,这让我觉得它不再是必需的。那么-fPIC现在是多余的还是需要生成单独的.o文件,一个用于静态库,一个用于共享库? 最佳答案

c++ - 如何在 C++ (gcc) 中获得完全限定的函数名称,_不包括_返回类型?

Thisquestion描述了如何使用__PRETTY_FUNCTION__获取函数的完整名称,包括其返回类型、参数类型、命名空间和模板参数。考虑以下漂亮的函数:namespacefoo{namespace{templateint(*bar(int(*arg)(int*)))(int*){printf("%s\n",__PRETTY_FUNCTION__);returnarg;}}//anonymousnamespace}//namespacefoo如果您不明白,该函数接受并返回一个指向int*->int函数的指针。它的漂亮名字是,当用g++(4.9)编译时,int(*foo::{an