在gcc编译器中禁用特定优化(死代码消除)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在gcc编译器中禁用特定优化(死代码消除)相关的知识,希望对你有一定的参考价值。
我想在c ++编译中禁用死代码消除优化。有没有办法通过保留所有其他-O优化来禁用此特定优化。我试过-fnodce但它不起作用。
更新(从评论中复制):我有类似的东西
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属性..
以上是关于在gcc编译器中禁用特定优化(死代码消除)的主要内容,如果未能解决你的问题,请参考以下文章