volatile
adj. |
易变的, 反复无常的, 易激动的 |
典型的例子 :
for ( int i = 0; i < 100000; i++);
编译器肯定要把这个空循环语句优化掉,根本就不执行,结果是 i = 0;
如果写成
for ( volatile int i = 0; i < 100000; i++);
它就会执行了, 结果是 i = 100000;
---------------------------------------我是分隔线-----------------------------------------
补充:
“hcx_2008” 这位同学批评的很好,我没有说清楚,现在说一下我的运行环境和测试方法:
环境:vs2008 (release编译)
工程类型:win32
方法:计时
具体如下:在vs2008下“i”无法单独打印出来,但通过耗时能看出编译器在 release 编译后是否优化了某些东西。
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化计时工具
double dbRet = 0.0f;
LARGE_INTEGER mliFrequency;
LARGE_INTEGER liCounterBegin;
LARGE_INTEGER liCounterEnd;
::QueryPerformanceFrequency(&mliFrequency);
::QueryPerformanceCounter(&liCounterBegin); //计时开始
for (int i = 0; i < 1000000000; i++);
::QueryPerformanceCounter(&liCounterEnd); //计时结束
// 输出被优化的运行时间,单位毫秒
dbRet = (double)(liCounterEnd.QuadPart - liCounterBegin.QuadPart) / (double)(mliFrequency.QuadPart) * 1000;
wprintf(_T("Optimized: %fms\n"), dbRet);
::QueryPerformanceCounter(&liCounterBegin); //计时开始
for (volatile int i = 0; i < 1000000000; i++);
::QueryPerformanceCounter(&liCounterEnd); //计时结束
// 输出未被优化的运行时间,单位毫秒
dbRet = (double)(liCounterEnd.QuadPart - liCounterBegin.QuadPart) / (double)(mliFrequency.QuadPart) * 1000;
wprintf(_T("Not Optimized: %fms\n"), dbRet);
return 0;
}
可以看到结果: