2

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

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

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

我想测量对象t构建时间并且什么都不做。我不想通过创建一个包含 1000 个对象的数组来做到这一点。有没有办法解决这个问题?

4

2 回答 2

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

于 2012-01-24T15:37:30.587 回答
0

Add "volatile" qualifier on constructed objects, this tells the compiler to assume that there are side-effects to construction thus preventing optimizing it away. That is:

timer t; 
t.start(); 
for(int i=1;i<=1000;++i) 
  volatile object t; 
t.stop(); 
于 2012-01-24T14:56:06.637 回答