MSYS2环境下g++编译器的std::clock()是否存在异常?
问题分析与解决
核心原因:编译器优化消除了循环
你的循环最终value为0,这是典型的编译器优化结果——如果value没有被实际使用(比如没有打印、没有作为函数返回值输出),编译器会直接判定这个循环没有意义,直接把整个循环删掉,甚至直接给value赋值0,根本不会执行任何计算。这种情况下,进程实际占用的CPU时间几乎为0,std::clock()前后的差值自然可以忽略,看起来就像始终返回初始值15。
解决方法:
- 给
value加上volatile修饰,强制编译器不优化该变量的读写:volatile int value = 0; - 确保
value被实际使用,比如在循环结束后用printf("%d\n", value);把它打印出来,或者作为程序的返回值return value;
关于MSYS2 g++的std::clock()实现
Windows平台下,MSYS2的g++(不管是mingw-w64还是ucrt64分支)的std::clock()都是基于Win32 API实现的,本身没有已知的系统性问题。你在Godbolt上测试正常,是因为Godbolt默认的编译选项可能没有开启最高级优化,或者你的测试代码中value被正确使用了,循环没有被优化掉。
另外,std::clock()返回的是进程占用的CPU时间片总和,单位是CLOCKS_PER_SEC(通常是1000),如果循环没执行,两次调用的差值就是0,计算出来的CPU时间自然为0,这完全符合预期,不是函数实现的问题。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

