C++ 标准计时溢出

标签 c++ overflow c++-chrono

我正在尝试实现一个用于调试的秒表,如下所示:

#include <chrono>

namespace sbstd
{
    class timer
    {
    private:
        bool m_running = false;
        std::chrono::time_point<std::chrono::system_clock> m_temp;
        std::chrono::nanoseconds m_time;
    public:
        void start()
        {
            if (m_running) { throw std::exception("timer already running"); }
            m_temp = std::chrono::system_clock::now();
            m_running = true;
        }

        void stop()
        {
            if (!m_running) { throw std::exception("timer not started"); }
            m_time += std::chrono::system_clock::now() - m_temp;
            m_running = false;
        }

        long long get_ms() const
        {
            return std::chrono::duration_cast<std::chrono::milliseconds>(m_time).count();
        }
    };
}

在主要方法中,我有以下内容:

sbstd::timer t1;
t1.start();
std::this_thread::sleep_for(std::chrono::seconds(5));
t1.stop();
cout << t1.get_ms();

我得到的不是 5000,而是一个负整数。

怎么了?

最佳答案

m_time 未初始化,因此其值不确定 - 它只是一些垃圾值。您可能希望将其初始化为 0 - 使用 std::chrono::nanoseconds::zero()Here它在行动。

关于C++ 标准计时溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517676/

相关文章:

c++ - 与 'operator<<' const std::chrono::duration<double, std::milli> 不匹配

c++ - 获取最大变量时,使用函数和宏有什么区别

c++ - 在与多个字段进行比较时提供严格的排序

安卓文字溢出

overflow - VHDL - 将两个 8 位向量添加到一个 9 位向量中

c++ - 如何获得双倍的高分辨率时间戳?

c++ - sleep_until 过去的某个时间点

c++ - vim 大括号匹配带有大括号的注释

c++ - 是否存在目标缓冲区需要多个内部字符空间的 codecvt 解码方案?

sql - 如何处理 silent mysql sum() 整数溢出?