草庐IT

c++ - 为什么 gcc 会警告 alignas 值过大?

当用gcc6.3编译时,这个例子程序#includeclassalignas(4096)A{std::arrayarray;};intmain(){Aa;}给出以下警告:3::3:21:warning:requestedalignment4096islargerthan128[-Wattributes]classalignas(4096)A{^虽然gcc7.2没有这样的错误。Example这是否意味着编译器只是通知对齐太大?这种警告的目的是什么?标准不允许编译器忽略此对齐说明符(即使存在警告),是吗? 最佳答案 标准允许allsor

c++ - libstdc++ 的 make_shared 布局是否在 gcc 4.x 和 gcc 6.x 之间发生了变化?

考虑以下由三个文件组成的最小示例:foo.h:#pragmaonce#includestructX{uint64_ti=0xdeadbeefdeadbeefULL;};voidfoo();foo.cxx:#include"foo.h"voidfoo(){std::make_shared();}main.cxx:#include#include"foo.h"templatestd::shared_ptrstd::make_shared();intmain(){foo();}然后用不同版本的gcc编译这两个翻译单元:$g++-4.8.2-g-std=c++11-O0-cfoo.cxx-of

c++ - GCC 模板推导消除 const 错误?

我发现这段代码可以用GCC7.3编译和运行,但不能用clang7编译和运行:conststd::vectorfoo({1,2,3,4});foo.clear();我预计会出现编译器错误,但GCC很乐意清除vector。 最佳答案 这是GCC错误83818;它已通过GCC8修复。不幸的是,那里没有更多信息——唯一的“修复”似乎是不使用类模板参数推导或升级编译器。 关于c++-GCC模板推导消除const错误?,我们在StackOverflow上找到一个类似的问题:

c++ - 不同的内在行为取决于 GCC 版本

我对内在函数很陌生,我在GCC-7.4和GCC-8.3中遇到了我的代码的不同行为我的代码很简单b.cpp:#include#includevoidfoo(constfloatnum,constfloatdenom){const__v4sfnum4={num,num,num,num,};const__v4sfdenom4={denom,denom,denom,denom,};floatres_arr[]={0,0,0,0};__v4sf*res=(__v4sf*)res_arr;*res=num4/denom4;std::cout在b.cpp中,我们基本上只是从浮点变量构造两个__v4s

c++ - 如何禁用没有命令行开关的 gcc 警告?

我收到以下警告:warning:'X'isinitializedanddeclared'extern'和它lookslikeit'snobigdeal我可以禁用它。更改代码对我来说并不是一个好主意,因为我无法控制代码,我只需要编译它。所以我想禁用警告。如果它旁边有一个-WSomeDefect键,那么我可以使用一个-Wno-SomeDefect命令行开关,但看起来这个警告没有明显的开关.如何禁用此类警告? 最佳答案 对于提出的问题的直接回答:从GCC的源代码中可以看出,没有(半)特定的开关来禁用此警告。它似乎只能通过禁用所有警告(-w

c++ - GCC、Unicode 和 __FUNCTION__

我正在尝试让我的项目在GCC下编译(VisualStudio可以完美地编译它)。我有一个自定义断言函数,它会抛出一条wstring消息。它的一部分是__FUNCTION__宏,我使用MSDN中的WIDEN宏将其“统一编码”#defineWIDEN2(x)L##x#defineWIDEN(x)WIDEN2(x)它在MSVC中编译正常,但在GCC中打印如下:error:‘L__FUNCTION__’wasnotdeclaredinthisscope我能想到的唯一解决方案是在运行时使用mbstowcs将__FUNCTION__的内容转换为wstring,但我想找到一种编译时方法来完成它。感谢

c++ - 英特尔编译器与 GCC

当我使用Intel的编译器编译应用程序时,它比使用GCC编译它时慢。英特尔编译器的输出速度要慢2倍以上。该应用程序包含多个嵌套循环。GCC和我遗漏的Intel编译器之间有什么区别吗?我是否需要打开一些其他标志来提高英特尔编译器的性能?我希望英特尔编译器至少与GCC一样快。编译器版本:Intelversion12.0.020101006GCCversion4.4.420100630Thecompilerflagsarethesamewithbothcompilers:-O3-openmp-parallel-mSSE4.2-Wall-pthread 最佳答案

c++ - 简而言之,GCC 选项 -fipa-pta 的作用是什么?

根据GCC手册,-fipa-pta优化会:-fipa-pta:Performinterproceduralpointeranalysisandinterproceduralmodificationandreferenceanalysis.Thisoptioncancauseexcessivememoryandcompile-timeusageonlargecompilationunits.Itisnotenabledbydefaultatanyoptimizationlevel.我假设GCC试图根据过程中使用的指针和引用来区分可变和不可变数据。有更深入的GCC知识的人可以解释一下-fi

c++ - 如何在用 gcc(不是 g++)编译的 C 项目中组合 C++ 目标文件?

又一个C/C++集成问题:我正在尝试使用C++库(我们称之为libcl.a)中的功能更新一些遗留C库(我们称之为libcppl.a)。liblc.a库在我的环境中被广泛使用,并链接到许多C项目中,使用GCC(在C编译器模式下):>>gccprog.c-lcllibcl.a目前包括cl.o目标文件(使用gcc从cl.c+cl.h创建)。libcppl.a由cppl.o组成目标文件(使用g++从cppl.cpp+cppl.h创建)。因为现有的应用程序是用C语言编写的,而构建脚本使用的是GCC,所以我希望尽可能简单地过渡到更新后的库。因此,我想继续使用GCC作为主要编译器,但仍然能够链接到更

c++ - 这是(枚举 : char {}) a gcc bug?

在gcc-4.5下打印0,在gcc-4.6下打印1。#includeenumVenueId:char{};intmain(intargc,char**argv){VenueIdv=(VenueId)'P';std::cout 最佳答案 根据标准,VenuedId具有char类型作为基础类型,因此v应包含char'P',v=='P'应该产生true。§7.2枚举声明Eachenumerationdefinesatypethatisdifferentfromallothertypes.Eachenumerationalsohasanun