草庐IT

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

c++ - 为什么这个 constexpr 函数在 gcc 的不同情况下给出不同的结果?

所以我有以下简单的片段:templatestructSquareMatrix{public:Tdata[size*size];constexprT&operator()(constsize_trow,constsize_tcol)noexcept{returndata[row*size+col];}};constexprautogenerate(){autoresult=SquareMatrix{};result(0,0)=1;result(1,0)=3;result(0,1)=2;result(1,1)=4;returnresult;}data的预期内容SquareMatrix中的数

c++ - 在没有 root 的情况下安装 GCC-4.9 - 添加路径和二进制文件等等

我刚刚使用链接here安装了gcc4.9这是一个很好的链接。但我只有一个问题,我不想尝试避免搞砸-->链接库和路径变量。我们学院有一个集群,我将它安装在我的主目录中(没有root)。现在我的主目录包含这个文件夹,所有gcc文件夹都在这个文件夹中:binincludeliblib64libexecshare我需要做些什么才能通过附加链接指向bin文件夹中的g++/gcc二进制文件?例如设置ld_library_path,设置二进制路径(exportPATH=/home/asdf/gcc4.9/bin:$PATH)。等..任何人都可以通过绕过由root安装的旧版本gcc来提供有关使用gcc

c++ - GCC 中的循环展开行为

这个问题部分是GCC5.1Loopunrolling的后续问题.根据GCCdocumentation,并且正如我在对上述问题的回答中所述,诸如-funroll-loops之类的标志打开“完整循环剥离(即完全删除具有少量恒定迭代次数的循环)”。因此,当启用这样的标志时,如果编译器确定这将优化给定代码段的执行,则它可以选择展开循环。尽管如此,我在我的一个项目中注意到GCC有时会展开循环即使相关标志未启用。例如,考虑以下简单代码:intmain(intargc,char**argv){intk=0;for(k=0;k当使用-O1编译时,循环被展开并使用任何现代版本的GCC生成以下汇编代码:m

c++ - 这是gcc的错误吗?

#include#include#includestd::stringto_gbk(conststd::wstring&u16_str){usingFacet=std::codecvt_byname;std::wstring_convert>wstr_2_gbk(newFacet("zh_CN.GBK"));returnwstr_2_gbk.to_bytes(u16_str);}intmain(){to_gbk(L"");}clang和vc++都可以,但是gcc6.2输出:[root@localhost~]#g++main.cppInfileincludedfrom/usr/inclu