gpt4 book ai didi

c++ - 你能用 ctime 重现或解释这个 Visual C++ 错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:22 24 4
gpt4 key购买 nike

code example在 Release模式下使用 Visual Studio Professional 2013 Update 3 编译时,无论 N 的值如何,都将输出 time: 0,32 位和 64 位选项:

#include <iostream>
#include <functional>
#include <ctime>

using namespace std;

void bar(int i, int& x, int& y) {x = i%13; y = i%23;}

int g(int N = 1E9) {
int x, y;
int r = 0;

for (int i = 1; i <= N; ++i) {
bar(i, x, y);
r += x+y;
}

return r;
}

int main()
{
auto t0 = clock();
auto r = g();
auto t1 = clock();

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

return 0;
}

在 rextester.com 上使用 gcc、clang 和其他版本的 vc++ 进行测试时,它的行为正确并输出大于零的 time。有什么线索吗?

我注意到内联 g() 函数可以恢复正确的行为,但会更改 t0r 的声明和初始化顺序>t1 没有。

最佳答案

如果您使用调试器查看反汇编窗口,您可以看到生成的代码。对于处于 Release模式的 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<<<std::char_traits<char> > (0AF17F0h)
00AF1341 mov ecx,eax
00AF1343 call dword ptr ds:[0AF302Ch]
00AF1349 mov ecx,eax
00AF134B call dword ptr ds:[0AF3034h]

从汇编的前 4 行可以看出,对 clock (ds:[0AF30E0h]) 的两次调用发生在对 g< 的调用之前。所以在这种情况下,g 花费多长时间并不重要,结果只会显示这两个顺序调用之间的时间。

似乎 VS 已经确定 g 没有任何会影响 clock 的副作用,因此可以安全地移动调用。

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

关于c++ - 你能用 ctime 重现或解释这个 Visual C++ 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com