3

只是一些优化注意事项:

有谁知道英特尔 C++ 编译器(例如 ICC 13.0,当然,使用 /O3 等一些优化选项编译)是否会自动优化代码中任何未使用/未调用的结构/类/函数/变量,例如 examplefun () 以下:

         //...defining examplefunc()....//

         const int a=0;
         if (a>0) 
            int b=examplefunc();
4

2 回答 2

4

编译器通常不会优化未使用的函数,除非它们是static并且因此只能在特定模块中访问。但是,如果链接是在函数级别而不是模块级别完成的,则链接器可能会死剥离函数。

您可以检查程序集输出、链接器映射或使用类似objdump的方法来检查函数是否包含在链接的二进制文件中。

于 2012-11-23T03:28:11.690 回答
3

我不认为这个问题是正确的。虽然问题从字面上询问编译器是否会优化未使用的函数,但这是只有链接器才能做的事情。

那么编译器能做什么呢?编译器可以优化掉死代码,例如在上面的代码中,并且因为a已知是0,编译器可以完全删除该if语句。对于大多数用途来说,这已经足够好了(一个函数是否成为可执行文件不会对性能产生太大影响,是否避免分支会影响函数的性能——尤其是分支错误预测)。

另外,如果编译器对上面的分支进行优化,程序中对函数的引用就会少一个exampleFunc,而链接器在处理生成的二进制文件时,如果整个程序中没有对函数的引用,它可以去掉符号共。请注意,这只能作为程序链接的一部分来完成,对于库,即使现在不调用该函数,稍后与该库链接的程序也可能会使用它。

所以回到最初的问题,编译器将优化分支,链接器可能会或不会从二进制文件中删除函数,但这并不重要。

关于其他结构, forstructclass,唯一使它成为二进制文件的是成员函数,并且同样适用于那里:如果您正在链接程序并且没有使用任何函数,则链接器可以删除符号。

于 2012-11-23T04:36:19.657 回答