只是一些优化注意事项:
有谁知道英特尔 C++ 编译器(例如 ICC 13.0,当然,使用 /O3 等一些优化选项编译)是否会自动优化代码中任何未使用/未调用的结构/类/函数/变量,例如 examplefun () 以下:
//...defining examplefunc()....//
const int a=0;
if (a>0)
int b=examplefunc();
只是一些优化注意事项:
有谁知道英特尔 C++ 编译器(例如 ICC 13.0,当然,使用 /O3 等一些优化选项编译)是否会自动优化代码中任何未使用/未调用的结构/类/函数/变量,例如 examplefun () 以下:
//...defining examplefunc()....//
const int a=0;
if (a>0)
int b=examplefunc();
编译器通常不会优化未使用的函数,除非它们是static
并且因此只能在特定模块中访问。但是,如果链接是在函数级别而不是模块级别完成的,则链接器可能会死剥离函数。
您可以检查程序集输出、链接器映射或使用类似objdump
的方法来检查函数是否包含在链接的二进制文件中。
我不认为这个问题是正确的。虽然问题从字面上询问编译器是否会优化未使用的函数,但这是只有链接器才能做的事情。
那么编译器能做什么呢?编译器可以优化掉死代码,例如在上面的代码中,并且因为a
已知是0
,编译器可以完全删除该if
语句。对于大多数用途来说,这已经足够好了(一个函数是否成为可执行文件不会对性能产生太大影响,是否避免分支会影响函数的性能——尤其是分支错误预测)。
另外,如果编译器对上面的分支进行优化,程序中对函数的引用就会少一个exampleFunc
,而链接器在处理生成的二进制文件时,如果整个程序中没有对函数的引用,它可以去掉符号共。请注意,这只能作为程序链接的一部分来完成,对于库,即使现在不调用该函数,稍后与该库链接的程序也可能会使用它。
所以回到最初的问题,编译器将优化分支,链接器可能会或不会从二进制文件中删除函数,但这并不重要。
关于其他结构, forstruct
和class
,唯一使它成为二进制文件的是成员函数,并且同样适用于那里:如果您正在链接程序并且没有使用任何函数,则链接器可以删除符号。