c++ - 在 C++11 中处理毫秒的正确方法是什么

标签 c++ c++11 chrono

我正在尝试将项目的基本开发库从 C++98 更新到 C++11。

在dev库中,有很多关于时间的函数,比如

uint64_t getCurrentMSTime()
{
    struct timeval stv;
    gettimeofday(&stv, NULL);
    uint64_t ms = stv.tv_sec ;
    ms = ms * 1000 + stv.tv_usec / 1000;
    return ms;
}

我正在尝试用 std::chrono 来改变它C++11 的。

目前看来我有两个选择,一个是返回time_point ,另一个是立即返回std::chrono::milliseconds::rep

std::chrono::time_point<std::chrono::system_clock> getCurrentTime1() {
    return std::chrono::system_clock::now();
}

std::chrono::milliseconds::rep getCurrentTime2() {
    return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}

嗯,我知道第一个更灵活,因为它返回 time_point ,这意味着我们可以将其转换为毫秒、纳秒、秒等,而第二个仅返回毫秒。

但是假设开发人员只使用毫秒,所以我们可以忽略灵活的问题。

在这种情况下,哪个更好?

顺便说一句,开发人员会做这样的事情:std::map<std::string, ???> mp; .所以我的代码将决定 ???部分。

std::map<std::string, std::chrono::time_point<std::chrono::system_clock>> mp{std::string("abc"), getCurrentTime1()};
对比
std::map<std::string, std::milliseconds::rep> mp{std::string("abc"), getCurrentTime2()}; .

哪个更好?或者它们几乎相同?

最佳答案

我同意当前接受的答案,即您应该重视类型安全,而不是返回整数类型。但是我不同意返回毫秒是最好的。

类型安全也适用于时间点和持续时间之间的差异。例如,添加两个持续时间是非常有意义的。但是添加两个时间点是没有意义的,尽管您可以减去它们产生持续时间。

因为getCurrentTime()的意思是返回当前时间点,所以应该返回一个std::chrono::time_point。可以很容易地选择以毫秒精度返回一个基于system_clocktime_point:

std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
getCurrentTime()
{
    return std::chrono::time_point_cast<std::chrono::milliseconds>(
        std::chrono::system_clock::now());
}

在 C++20 中,此类型有一个方便的类型别名,以使其更容易拼写。如果您想抢先一步,可以为自己创建这样的类型别名:

std::chrono::sys_time<std::chrono::milliseconds>
getCurrentTime()
{
    return std::chrono::time_point_cast<std::chrono::milliseconds>(
        std::chrono::system_clock::now());
}

或者您可以创建一个更短的名称以便在您的应用程序中使用,也许:

using MSTime = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>;
...
MSTime
getCurrentMSTime()
{
    return std::chrono::time_point_cast<MSTime::duration>(
        std::chrono::system_clock::now());
}

关于c++ - 在 C++11 中处理毫秒的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68406846/

相关文章:

c++ - ideone 和 codeblocks 中相同输入的不同输出(小阶乘)

c++ - 编译 C++ 应用程序时出现 undefined reference 错误

c++ - 接受大括号构造对象的可变模板列表的函数

c++ - 如何修改引用 std::pair 的值?

c++ - 在循环中创建线程 vector 的问题

c++ - 将 OpenGL 基元转换为 OpenGLES

c++ - 代码中奇怪的 constexpr 参数

c++ - 不同机器之间标准时钟的显着性能差异

c++ - 我可以重新定位 chrono 类以使用微 Controller 作为滴答生成器吗?

c++ - C++向chrono::system_clock::time_point添加月份