未使用的函数会被优化掉吗?

28 浏览
0 Comments

未使用的函数会被优化掉吗?

现如今的编译器往往会进行大量的优化。它们是否也会从最终输出中删除未使用的函数呢?

0
0 Comments

未使用的函数是否会被优化掉?

一般来说,答案是:

对于未使用的静态函数,会被优化掉。

对于未使用的全局可用函数,不会被优化掉。

编译器无法知道其他编译单元是否引用了该函数。而且,大多数目标模块类型在编译后不允许删除函数,并且也没有提供一种方式让链接器判断是否存在内部引用(链接器可以判断是否存在外部引用)。一些链接器可以做到这一点,但有很多因素会阻碍这一点。

当然,一个单独的模块中的函数,除非它是共享库的一部分,否则不会被链接器不必要地加载(因为显然它可能在运行时被引用)。

我相信现代链接器不会在使用之前加载函数。至少,使用RTLD_LAZY的dlopen函数暗示这是可能的。

0
0 Comments

未使用的函数是否会被优化掉是一个编译器和链接器的行为问题。不同的编译器和链接器有不同的方法来优化未使用的函数。

在MSVC(Visual Studio编译器/链接器)中,可以通过使用编译选项`/Gy`进行编译,并使用链接选项`/OPT:REF`进行链接来实现优化。

在GCC/binutils中,可以通过使用编译选项`-ffunction-sections -fdata-sections`进行编译,并使用链接选项`--gc-sections`进行链接来实现优化。

其他编译器的行为不太清楚。

需要注意的是,使用`/OPT:REF`会导致非标准行为:它会优化掉那些只有地址被使用的函数,使得地址变得无效。而GCC不会出现这种情况。

- MSVC可以通过编译选项`/Gy`和链接选项`/OPT:REF`来优化未使用的函数。

- GCC/binutils可以通过编译选项`-ffunction-sections -fdata-sections`和链接选项`--gc-sections`来优化未使用的函数。

- 其他编译器的行为不确定。

0
0 Comments

根据编译器的不同,未使用的函数是否会被优化掉是不确定的。Visual C++ 9可以做到这一点,未使用的静态函数会在编译阶段被删除(甚至有一个C4505警告用于提示未使用的函数),未使用的具有外部链接的函数可以在链接阶段通过链接器的设置进行删除。

0