易失性指向易失性数据

时间:2017-04-05 10:29:47

标签: c++ volatile visual-c++-2010

我正在尝试评估我的程序的不同版本,看看它们有多快。我在Visual Studio 2010中发现了一个奇怪的东西(使用Windows 10)。我还没有尝试过不同的编译器或系统。请参阅以下代码:

uint64 t=0x45484856167;
int k=0;
(volatile) uint64* (volatile) source=new uint64[2048];
source[0]=0x74451523156321;
for (int k=1;k<1024;k++) {source[k]=(source[k-1]<<14)+713*k}//initilisation
uint64 start = Gettime();
//main loop
for (uint64 i = 0; i < 900000000;i+=1) {
    const uint64 mask=source[k+1];
    ((t&mask)==(source[k]&mask))? k=(k+2)&2047 : k=(k-2)&2047 ;
}
//main loop end
uint64 end = Gettime();

现在,当使用两种挥发物时,它具有与不使用挥发物时相同的运行时间。当仅使用第二个volatile时也发生了同样的情况。但是当只使用第一个时,它就会变慢。但是,删除初始化循环或在初始化和for for循环之间放置一些代码,可以消除这种现象,并且挥发物的任何组合都具有相同的运行时间。我明白为什么这两个修改可能会导致在主动循环中加速主循环,但为什么volatile * volatilevolatile *更快?

0 个答案:

没有答案