在gcc编译器中禁用特定优化(死代码消除)

时间:2012-01-24 14:14:11

标签: c++ optimization gcc dead-code

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

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

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

我想测量对象t构建时间并且不做任何事情。我不想通过创建1000个对象的数组来做到这一点。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

好吧,如果您只是想测量对象的初始化时间,为什么还要尝试强制编译器以避免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属性..