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

问题描述 投票:2回答:2

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

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

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

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

c++ optimization gcc dead-code
2个回答
0
投票

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

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

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属性..

© www.soinside.com 2019 - 2024. All rights reserved.