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

Disabling specific optimization(Dead code elimination) in gcc compiler

本文关键字:代码 优化 编译器 gcc 禁用      更新时间:2023-10-16

我想禁用c++编译中的死代码消除优化。有没有一种方法可以通过保留所有其他-O优化来禁用这个特定的优化。我试过用-fnodece,但没有用。

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

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

我想测量对象t的构建时间,而不使用它。我不想通过创建1000个对象的数组来实现这一点。有办法解决这个问题吗?

在构造的对象上添加"volatile"限定符,这告诉编译器假设构造有副作用,从而阻止对其进行优化。即:

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

如果你只想测量对象的初始化时间,为什么要强迫编译器避免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属性。。