C++11 windows和linux上系统时钟的不同行为

C++11 windows和linux上系统时钟的不同行为,c++11,visual-c++,cross-platform,chrono,C++11,Visual C++,Cross Platform,Chrono,对于给定的程序,我在Windows(VS17)上得到的结果与linux机器(GCC4.8)不同 #包括“CrossDevelopment.h” 使用名称空间std; int main() { 用于(自动i=0;i+/-292000年。微秒->+/-292000年。 1730ns 17[1/10000000]s 1µs

对于给定的程序,我在Windows(VS17)上得到的结果与linux机器(GCC4.8)不同

#包括“CrossDevelopment.h”
使用名称空间std;
int main()
{
用于(自动i=0;i<3;i++)
{
//时钟::高分辨率时钟::时间点开始时间=时钟::高分辨率时钟::现在();
时钟::系统时钟::时间点开始时间=时钟::系统时钟::现在();
用于(自动i=0;i<50;i++){
INTA=10;
int b=5;
INTC=a+b;
c+=10;
c*=a;
a*=b;
}
//时钟::高分辨率时钟::时间点结束时间=时钟::高分辨率时钟::现在();
时钟::系统时钟::时间点结束时间=时钟::系统时钟::现在();
自动运行时间=计时::持续时间(结束时间-开始时间);
coutsystem_clock::time point
的精度不可跨平台移植。但是可以很容易地对其进行检查,并/或将其转换为您在问题中所做的已知精度

最简单的检查方法是使用我的:

在Windows上:

17[1/10000000]s
关于macOS:

1µs
说明:

在gcc上,
system\u clock::time\u point
的精度为纳秒,在Windows上,精度为
1/10'000'000
(100ns),在macOS上,精度为微秒

您可以通过查看
system\u clock::duration::period::num
system\u clock::duration::period::den
来检查精度,这是一个分数的分子和分母,该分数以秒为单位指定每个刻度表示的长度(在Windows上为1和10'000'000)


使用单位打印持续时间的能力(如允许),目前在C++20规范中。

系统时钟的精度可能重复::时间点不能跨平台移植。为什么?
的设计允许您充分利用计时硬件,而不必欺骗您(宣传比它能提供的精度更高的精度),而不必使用以最低公分母编写的API(使用比它所能提供的精度更粗糙的精度)。
供应商可以提供他们认为对给定平台的客户最有用的任何精度。客户可以利用任何(可发现的)优势精度
提供或轻松转换为他们想要的任何方便的精度。此外,更高的精度不是免费的。有三个调谐旋钮:大小、范围和精度。您可以有任意两个,但代价是第三个。
系统时钟::时间点的大小通常固定为64位(不必如此,但这在今天的硬件上是实用的)。考虑到尺寸、精度和范围是相互牺牲的。纳秒->+/-292年。100ns->+/-292000年。微秒->+/-292000年。
1730ns
17[1/10000000]s
1µs