`
hanyezhiyu8
  • 浏览: 153651 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Volatile

 
阅读更多

volatile

[ˈvɔlətail]

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;
}

 

 

可以看到结果:

 



  

  • 大小: 13 KB
分享到:
评论
3 楼 hanyezhiyu8 2011-08-10  
hcx_2008 写道
真是误人子弟,前面那个一样会值行。

可能我没说清楚测试的方法,已经补充说明了,可以看一下。工程属性中有“optimization”选项,所以release编译后会优化很多东西。
2 楼 hcx_2008 2011-08-03  
后面那个连编译都不会通过
1 楼 hcx_2008 2011-08-03  
真是误人子弟,前面那个一样会值行。

相关推荐

Global site tag (gtag.js) - Google Analytics