time()函数的替代方案

3
MISRA和AUTOSAR不允许我们使用<ctime>(和<time.h>)的time()函数。

规则18-0-4:不得使用库<ctime>的时间处理函数。

C++中有<chrono>时间库可以使用,但我没有找到类似time()返回当前时间的函数。是否有遗漏?

@DrewDormann 哇!回答得好快!谢谢! 我需要将它转换为time_t类型才能获得与time()相同的效果吗? - KplnMoon
@DrewDormann 我知道 to_time_t 函数,但我的想法是正确的,对吧?无论如何,谢谢! - KplnMoon
1
由于C函数 time() 返回 time_t 类型,如果您需要相同的效果(获取一个低得多的时间),to_time_t() 将生成该值。 - Drew Dormann
1个回答

3
使用 <chrono> 头文件需要比使用 time 函数更多的涉及。
您可以使用 std::chrono::steady_clock::now() 创建一个 time_point。相减两个 time_point 实例会创建一个反映两个实例之间时间差异的 std::duration。然后,您可以使用 duration_cast 将这个持续时间转换为您选择的刻度(微秒、毫秒等),然后使用 count 成员函数以无符号类型获取实际时间。
简而言之,您可以通过以下方式测量两个事件之间的经过时间:
const auto start = std::chrono::steady_clock::now(); // event 1
// something happens in between...
const auto end = std::chrono::steady_clock::now(); // event 2
const auto time_elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();

注意:

  1. time_elapsed 不是浮点变量,
  2. 建议使用 std::chrono::steady_clock 代替 std::chrono::system_clock,因为前者是单调时钟,即不受操作系统调整。

2
AUTOSAR表示:“注意:应使用<chrono>中的设施。” - Howard Hinnant
@Nitin_Malapally 谢谢!下面两行代码不是等价的吗:(1) time(nullptr); 和 (2) system_clock::to_time_t(system_clock::now());?我不太明白为什么我还需要使用 duration_cast? - KplnMoon
1
C++11/14/17 <chrono> 视频教程:https://www.youtube.com/watch?v=P32hvk8b13M。虽然需要花费一个小时的时间,但希望这将是值得的。 - Howard Hinnant
2
@KplnMoon 你也可以这样做。但是就像我说的,系统时钟不一定是单调的,即它可能会被重置。这意味着你可能会在时间戳之间发现不规则性。 - Nitin Malapally

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接