MS VS-2005编译器优化不删除未使用/未执行的代码

时间:2009-10-14 15:47:26

标签: compiler-optimization

我有一个使用MS-Visual Studio 2005和所有C代码构建的工作空间。我看到许多未被调用的函数但它们仍然被编译(它们不在任何编译时宏下以禁止它们编译)。

我为MS-VS2005项目设置了以下优化设置,以删除未使用的代码: -

优化级别 - / Ox

启用整个程序优化 - / GL

我尝试了偏好速度/ Ot和偏好尺寸/ Os

尽管有这些选项,当我看到链接器生成的地图文件时,我会看到地图文件中存在的符号(未命中的函数)。

我错过了什么吗?我想完全删除未使用的代码。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

编译器一次一个地编译C文件。因此,在编译包含未使用函数的C文件时,编译器无法确定它是否会从另一个文件中调用,因此它也会编译该函数。但是,如果该函数被声明为static(文件范围),则编译器会知道它未被使用,因此将其删除。

即使进行了整个程序优化,我认为由于编译可能适用于库,因此仍然无法完成。

Linkers做了类似于你想要的事情。如果您的代码链接到包含多个对象的库,那么任何不包含代码使用的函数的对象(直接或间接)都不会包含在最终的可执行文件中。

一种选择是将代码分成单独的库和目标文件。

PS - 这只是我的猜测。编译器(具有整个程序优化)或链接器的行为主要取决于特定编译器或链接器的设计选择

答案 1 :(得分:0)

在我们的项目中,我们在项目属性\ Linker \ Refrences下设置了一个标志。我们将其设置为消除未引用数据(/ OPT:REF),根据描述这应该删除从未使用的函数调用或数据。我只是按照描述,我从来没有测试过它或使用它。但我刚刚在最后一小时内看到它,并认为它可能是你可以尝试的东西。