【问题标题】:MS VS-2005 Compiler optimization not removing unused/unexecuted codeMS VS-2005 编译器优化未删除未使用/未执行的代码
【发布时间】:2009-10-14 15:47:25
【问题描述】:

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

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

优化级别 - /Ox

启用整个程序优化 - /GL

我尝试了 Favor speed /Ot 和 Favor Size /Os

尽管有所有这些选项,当我看到链接器生成的映射文件时,我看到了映射文件中存在的符号(未使用函数)名称。

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

我该怎么做?

【问题讨论】:

  • 如何生成 .map 文件,您正在编译什么类型的项目(.exe?.dll?.lib?)。

标签: compiler-optimization


【解决方案1】:

编译器一次编译一个 C 文件。因此,在编译包含未使用函数的 C 文件时,编译器无法确定不会从另一个文件调用它,因此它也会编译该函数。但是,如果该函数被声明为静态(文件范围),那么编译器会知道它没有被使用并因此删除它。

即使对整个程序进行了优化,我认为仍然无法完成,因为编译可能是针对库的。

链接器执行与您正在寻找的类似的事情。如果您的代码链接到包含多个对象的库,那么任何不包含您的代码(直接或间接)使用的函数的对象都不会包含在最终的可执行文件中。

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

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

【讨论】:

    【解决方案2】:

    在我们的项目中,我们在项目属性\链接器\参考下设置了一个标志。我们将其设置为 Eliminate Unreferenced Data (/OPT:REF),根据描述,这应该删除从未使用过的函数调用或数据。我只是按照描述进行,我从未测试过或使用过它。但我只是在最后一个小时内碰巧看到了它,并认为这可能是你可以尝试的。

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多