草庐IT

c++ - 使用 GCC 查找无法访问的函数 ("dead code")

我正在寻找一种在(非常)大的C++项目中查找静态无法访问的函数的方法。我曾尝试使用doxygen和此处建议的其他静态分析工具,但似乎该项目太复杂了,他们无法处理。最后我决定使用GCC工具(g++、gprof、gcov等)是最安全的选择,尽管我不知道该怎么做。我认为g++优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称。你有什么建议吗? 最佳答案 死代码优化通常由链接器完成——编译器没有概览。但是,编译器可能已经删除了未使用的static函数(因为它们具有内部链接)。因此,您不应该查看GCC选项,而应该查看ld选项。

c++ - 如何调试 STL/C++ 的 GCC/LD 链接过程

我正在使用C++开发裸机cortex-M3,以获取乐趣和利润。我使用STL库是因为我需要一些容器。我认为通过简单地提供我的分配器它不会向最终的二进制文件添加太多代码,因为你只得到你使用的东西。实际上我什至没想到有任何与STL的链接过程(给我的分配器),因为我认为这都是模板代码。顺便说一下,我正在使用-fno-exception进行编译。不幸的是,我的二进制文件中添加了大约600KB或更多。我用nm查看了最终二进制文件中包含的符号,这对我来说似乎是个笑话。列表太长了,我不会尝试跳过它。虽然有一些弱符号。我还查看了链接器生成的.map文件,我什至找到了scanf符号.text0x00015

c++ - GCC 优化 : how can less operations be slower?

在尝试对我的代码的某些选项进行基准测试时(使用或不使用128位整数),我观察到一种我无法理解的行为。任何人都可以阐明这一点吗?#include#include#includeintmain(inta,char**b){printf("Runningtests\n");clock_tstart=clock();unsigned__int128t=13;for(unsignedlongi=0;i(注意这里有printf,这样gcc就不会优化for循环)在我的系统上,这可靠地产生了以下输出:u128,+25,took2.411922su128,no+,took1.799805su64,+25

c++ - 函数参数的析构函数在 gcc 和 MSVC 中被不同地调用

在将一些C++代码从MicrosoftVisualStudio移植到gcc时,我遇到了一个奇怪的错误,我最终将其归结为:#includeusingnamespacestd;classFoo{public:intdata;Foo(inti):data(i){cout如果我使用MicrosoftVisualStudio2015Community编译并运行上述代码,我会得到以下输出:Fooconstructedwith10movectorf.data=10Foodestructedwith10Fooconstructedwith20Foodestructedwith20Foodestruct

c++ - 所有版本的 GCC 都与默认成员初始化器斗争,它捕获了这个,并结合了继承的构造函数

这个故事和我之前的故事相似question.所有支持C++11的GCC版本都具有这种行为。我找不到与我的测试用例有冲突的任何其他编译器。测试用例:structBaseFooWrapper{BaseFooWrapper(intqux){}};structFoo{Foo(BaseFooWrapper&foo):foo(foo){}BaseFooWrapper&foo;};structSomeFooWrapper:publicBaseFooWrapper{usingBaseFooWrapper::BaseFooWrapper;Foofoo{*this};};intmain(){SomeFoo

c++ - 声明自身 (*this) 私有(private)的类以避免竞争条件/放弃 gcc 中线程私有(private)的请求

我想避免并行代码中的竞争条件。问题是我的类包含几个全局变量,为了简单起见,我们只说一个x以及一个我希望并行的for循环。实际代码还有一个方法,它接受一个指向类的指针,在本例中是它本身,作为它的参数,访问更多的全局变量。因此,将整个实例设为threadprivate可能是有意义的。我正在使用OpenMP。一个最小的工作示例是:#include#includeclasslotswork{public:intx;intf[10];lotswork(inti=0){x=i;};voidaddInt(inty){x=x+y;}voidcarryout(){#pragmaompparallelfo

c++ - 使用 gcc 编译 DLL

太棒了,我正在写一个脚本解释器。基本上,我希望一些类和函数存储在DLL中,但我希望DLL在链接到它的程序中查找函数,例如,programdll----------------------------------------------------sendcodetodll----->parsecode|vcodecontainsafunction,thatisn'tcontainedintheDLL|listoffunctionsinreturnvaluesentbacktotheparsingfunction我基本上想知道,如何使用gcc编译DLL?好吧,我正在使用gcc的Windo

c++ - "template"不需要关键字? [gcc/clang/Comeau 错误?]

这是测试代码templatevoidf(){Tt;t.f(0);//compilesevenwithoutthe"template"keyword,whatamImissing?}classabc{public:templatevoidf(int){}};intmain(){f();}我正在使用g++4.4.6。谢谢P.S:我已经大大编辑了我的问题。请不要介意。编辑:我向EDG的人问了这个问题,这是MikeHerrick不得不说的Wedodiagnosethisasanerrorin--strictmodeaswellasanymodethatenablesdependentnamel

c++ - GCC中enum switch的控制流不足分析

在下面的C++代码中:typedefenum{a,b,c}Test;intfoo(Testtest){switch(test){casea:return0;caseb:return1;casec:return0;}}使用-Wall编译时发出警告,表示控制到达非空函数的末尾。为什么?编辑说示例中的变量test可以包含任何值通常是不正确的。foo(12354)不编译:>test.cpp:15:14:error:invalidconversionfrom‘int’to‘Test’>test.cpp:15:14:error:initializingargument1of‘intfoo(Test

c++ - gcc 4.8.1 是否支持 C++11 垃圾回收?

我问的原因是,网络上存在相互矛盾的信息。一方面isocpp.org它指出GCC4.8.1已经完全实现了C++11标准。另一方面GCCC++11supportpage声明没有“对垃圾收集和基于可达性的泄漏检测的最低支持”。那么GCC4.8.1真的是C++11功能完整吗? 最佳答案 垃圾收集的支持是标准可选的(参见BjarneStroustrupC++11FAQ)。因此,GCC4.8.1是功能完整的,因为它实现了标准的所有强制性核心部分。评论证明我的回答不清楚,我会更具体:我只是在谈论对垃圾收集的核心支持。图书馆部分是强制性的。GCC4