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;
}
可以看到结果:

本文通过一个典型的空循环示例,展示了在C/C++中使用volatile关键字防止编译器优化的方法。通过对有无volatile修饰的循环进行计时对比,验证了volatile能够确保变量不被编译器优化,从而保留其值不受外部改变。
24万+

被折叠的 条评论
为什么被折叠?



