C++ 将易失性分配给非易失性,反之亦然
我想分析某个函数,为了得到更可靠的结果,我在循环中调用该函数。我担心编译器会发现我从不使用结果并优化我的循环,所以我认为我可以将结果复制到标记为volatile的变量,以防止出现这种情况()C++ 将易失性分配给非易失性,反之亦然,c++,volatile,C++,Volatile,我想分析某个函数,为了得到更可靠的结果,我在循环中调用该函数。我担心编译器会发现我从不使用结果并优化我的循环,所以我认为我可以将结果复制到标记为volatile的变量,以防止出现这种情况() #包括 结构条{}; 巴福(); 酒吧简介(u foo) { //结果标记为volatile,因此循环不会被优化 挥发性条结果; 对于(int i=0;i
#包括
结构条{};
巴福();
酒吧简介(u foo)
{
//结果标记为volatile,因此循环不会被优化
挥发性条结果;
对于(int i=0;i<10000;i++)
结果=foo();
返回结果;
}
int main(int argc,char*argv[])
{
使用名称空间std::chrono;
自动开始=高分辨率时钟::现在();
自动结果=profile_foo();
自动结束=高分辨率时钟::现在();
自动时间_通过=持续时间_投射(结束-开始).count();
//验证结果。。。
}
事实证明,类的易失性/非易失性实例之间没有默认的复制构造函数/赋值运算符。看
所以
注意:我无法修改类栏。类栏是否有一个为POD的数据成员?因此,您可以执行类似于
volatile double temp
temp=foo().getSomeDouble()
?如果函数foo
有明显的副作用,或者它是在另一个编译单元中定义的(编译器无法知道是否存在副作用),则不应优化循环。@serge ballesta foo可能没有副作用,并且驻留在静态库中。我认为积极的链接时间优化可能仍然决定优化掉。然后可以推广到volatile Bar*tmp;tmp=&result代码>。Bar的数据成员是否为POD?因此,您可以执行类似于volatile double temp
temp=foo().getSomeDouble()
?如果函数foo
有明显的副作用,或者它是在另一个编译单元中定义的(编译器无法知道是否存在副作用),则不应优化循环。@serge ballesta foo可能没有副作用,并且驻留在静态库中。我认为积极的链接时间优化可能仍然决定优化掉。然后可以推广到volatile Bar*tmp;tmp=&result代码>。