chrono duration_cast 在 cout 中做算术时不工作
chrono duration_cast not working when doing arithmetic in cout
我不理解以下行为
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
//some code here
std::cout << "time diff with arithmetic in cout: " << \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time << std::endl;
unsigned long time_diff = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time;
std::cout << "time_diff: " << time_diff << std::endl;
输出:
time diff with arithmetic in cout: <very large number (definitely not milliseconds)>
time_diff: <smaller number (definitely milliseconds)>
为什么在 cout 中进行算术运算时 duration_cast
不起作用?我对 time_diff
变量使用了 unsigned int
和 int
,但是当我第一次在变量初始化或赋值中进行算术运算时,我总是得到很好的输出。
注意
我正在使用 Visual Studio 2013(社区版)
你可能溢出了unsigned long
(sizeof为4):
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
推荐:
using namespace std::chrono;
auto begin_time = steady_clock::now();
//some code here
std::cout << "time diff with arithmetic in cout: " <<
duration_cast<milliseconds>(steady_clock::now() - begin_time).count() << std::endl;
duration_cast
没有问题,问题是 unsigned long
不够大,无法处理自纪元以来的毫秒时间。从 ideone 我得到这个输出:
Max value for `unsigned long`: 4294967295
Milliseconds since epoch: 15426527488
我直接输出得到毫秒数:
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() << std::endl;
在你的第一个输出中,你得到一个巨大的数字,因为 begin_time
被强制转换为 std::chrono::milliseconds::rep
(.count()
的 return 类型),它足够大以处理time_since_epoch
(由标准保证),而在您的第二个输出中,两个值都被 unsigned long
截断,因此您得到(可能)正确的结果。
注意:可能存在 unsigned long
足以处理此问题的体系结构,但您不应依赖它并直接使用为 std::chrono::duration
提供的算术运算符。
我不理解以下行为
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
//some code here
std::cout << "time diff with arithmetic in cout: " << \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time << std::endl;
unsigned long time_diff = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time;
std::cout << "time_diff: " << time_diff << std::endl;
输出:
time diff with arithmetic in cout: <very large number (definitely not milliseconds)>
time_diff: <smaller number (definitely milliseconds)>
为什么在 cout 中进行算术运算时 duration_cast
不起作用?我对 time_diff
变量使用了 unsigned int
和 int
,但是当我第一次在变量初始化或赋值中进行算术运算时,我总是得到很好的输出。
注意
我正在使用 Visual Studio 2013(社区版)
你可能溢出了unsigned long
(sizeof为4):
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
推荐:
using namespace std::chrono;
auto begin_time = steady_clock::now();
//some code here
std::cout << "time diff with arithmetic in cout: " <<
duration_cast<milliseconds>(steady_clock::now() - begin_time).count() << std::endl;
duration_cast
没有问题,问题是 unsigned long
不够大,无法处理自纪元以来的毫秒时间。从 ideone 我得到这个输出:
Max value for `unsigned long`: 4294967295
Milliseconds since epoch: 15426527488
我直接输出得到毫秒数:
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() << std::endl;
在你的第一个输出中,你得到一个巨大的数字,因为 begin_time
被强制转换为 std::chrono::milliseconds::rep
(.count()
的 return 类型),它足够大以处理time_since_epoch
(由标准保证),而在您的第二个输出中,两个值都被 unsigned long
截断,因此您得到(可能)正确的结果。
注意:可能存在 unsigned long
足以处理此问题的体系结构,但您不应依赖它并直接使用为 std::chrono::duration
提供的算术运算符。