我想禁用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属性。。