C++ 将易失性分配给非易失性,反之亦然

C++ 将易失性分配给非易失性,反之亦然,c++,volatile,C++,Volatile,我想分析某个函数,为了得到更可靠的结果,我在循环中调用该函数。我担心编译器会发现我从不使用结果并优化我的循环,所以我认为我可以将结果复制到标记为volatile的变量,以防止出现这种情况() #包括 结构条{}; 巴福(); 酒吧简介(u foo) { //结果标记为volatile,因此循环不会被优化 挥发性条结果; 对于(int i=0;i

我想分析某个函数,为了得到更可靠的结果,我在循环中调用该函数。我担心编译器会发现我从不使用结果并优化我的循环,所以我认为我可以将结果复制到标记为volatile的变量,以防止出现这种情况()

#包括
结构条{};
巴福();
酒吧简介(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