vs2019C语言ctime的问题解决,你能用ctime重现或解释这个Visual C bug吗?

这篇博客讨论了在VS2012express发布模式下,通过反汇编查看代码优化的情况。示例中展示了编译器如何判断并移动函数调用,以减少g函数的影响,只测量两个时钟调用之间的时差。添加volatile关键字可以防止编译器优化对时钟读取的影响。这揭示了编译器对代码副作用的理解及其在优化过程中的作用。
摘要由CSDN通过智能技术生成

如果您使用调试器查看反汇编挡板,您可以看到生成的代码.对于VS2012 express在发布模式下你得到这个:

00AF1310 push edi

auto t0 = clock();

00AF1311 call dword ptr ds:[0AF30E0h]

00AF1317 mov edi,eax

auto r = g();

auto t1 = clock();

00AF1319 call dword ptr ds:[0AF30E0h]

cout << r << " time: " << t1-t0 << endl;

00AF131F push dword ptr ds:[0AF3040h]

00AF1325 sub eax,edi

00AF1327 push eax

00AF1328 call g (0AF1270h)

00AF132D mov ecx,dword ptr ds:[0AF3058h]

00AF1333 push eax

00AF1334 call dword ptr ds:[0AF3030h]

00AF133A mov ecx,eax

00AF133C call std::operator<<<:char_traits> > (0AF17F0h)

00AF1341 mov ecx,eax

00AF1343 call dword ptr ds:[0AF302Ch]

00AF1349 mov ecx,eax

00AF134B call dword ptr ds:[0AF3034h]

从前4行汇编中你可以看到两次调用时钟(ds:[0AF30E0h])在调用g之前发生.因此,在这种情况下,g取多长时间并不重要,结果只会显示这两个顺序调用之间的时间.

似乎VS已经确定g没有任何可能影响时钟的副作用,因此可以安全地移动呼叫.

正如Michael Petch在评论中指出的那样,将volatile添加到r的声明中将阻止编译器移动调用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值