【问题标题】:Disabling specific optimization(Dead code elimination) in gcc compiler在 gcc 编译器中禁用特定优化(死代码消除)
【发布时间】:2012-02-17 18:51:32
【问题描述】:

我想在 c++ 编译中禁用死代码消除优化。有没有办法通过保留所有其他 -O 优化来禁用此特定优化。我尝试使用 -fnodce 但它不起作用。

更新(从评论中复制):我有类似的东西

timer t;
t.start();
for(int i=1;i<=1000;++i)
    object t;
t.stop();

我想测量对象t 的构造时间并且不对其进行任何操作。我不想通过创建一个包含 1000 个对象的数组来做到这一点。有没有办法解决这个问题?

【问题讨论】:

  • 这听起来像你把一些问题分成两部分,解决了简单的部分,现在正在努力解决困难的部分。为什么要做这样的事情?
  • 我有类似计时器 t 的东西; t.start(); for(int i=1;i
  • 如果您进行测量,您是否需要优化?或者即使在发布版本中您也需要测量?
  • 首先,您的循环不会测量对象创建时间,而是测量对象创建+销毁时间,所以我不确定这是否是您想要的。第二点:如果禁用某些优化(假设您需要优化构建的时间),您的测量将如何正确?毕竟编译器很可能会在构造函数/析构函数中执行一些死代码和死存储消除(特别是如果构造函数主体中有代码而不是在初始化时做所有事情)
  • 对于我的测量,我不需要其他优化,但我不喜欢 -g 选项,其中它添加了我不想要的调试符号。让我问不同的问题,是否可以通过任何编译器选项在没有任何调试符号的情况下进行优化?我正在寻找介于 -g 和 -O 选项之间的东西,

标签: c++ optimization gcc dead-code


【解决方案1】:

在构造对象上添加“volatile”限定符,这告诉编译器假设构造存在副作用,从而阻止优化它。那就是:

timer t; 
t.start(); 
for(int i=1;i<=1000;++i) 
  volatile object t; 
t.stop(); 

【讨论】:

  • 这肯定会禁用编译器的其他可能优化。
  • 感谢您的建议。这是有效的。但是除了立即刷新到内存等之外,我们是否有任何额外的 volatile 成本
  • 如果您有能力创建虚拟或更改类中某个字段的类型,则可以将其设置为 volatile。一个子对象就足以防止编译器优化其构造的副作用。
【解决方案2】:

如果你只是想测量你的对象的初始化时间,为什么要强迫编译器避免 DCE 和诸如此类的东西,而不是一开始就以避免问题的方式编写它?

object *arr = new object[100];   // allocate that outside the function and pass it into it
for (int i = 0; i < 100; i++) {
    arr[i] = new object;
}

如果函数足够大,可以避免内联,那应该可以解决问题 - 否则您可以导出函数并从另一个编译模块调用它以避免不必要的优化。简单,没有一些可能会产生意想不到的后果的编译器标志的技巧,唯一的开销是数组存储 - 如果这显着影响了您的时间,那么您无论如何都在测量错误的东西。

或者如果你真的想要一些编译器特定的标志 - gcc 有一个 noinline 属性..

【讨论】:

  • 感谢您的回复。我想测试对象的堆栈分配,但上面一个使用堆。实际上构造函数是在头文件中声明的,我没有更改头文件的权限。无论如何,不​​稳定的东西工作正常。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多