测试达到最大uint64_t C++大小的有效方法

Efficient way to test for reaching max size of uint64_t C++

本文关键字:C++ 方法 有效 uint64 测试      更新时间:2023-10-16

我有一个类,有两个类成员:

uint64_t m_numOfOperations;   // how many times an operation was done
uint64_t m_someOtherMember;  // will be divided by m_numOfOperations

在某个函数 updateNumberOfOperations() 中,我将这个计数器递增 1 并将m_someOtherMember除以计数器 (m_numOfOperations)y,如下所示:

m_someOtherMember = m_someOtherMember / m_numOfOperation;

现在,这个函数将被调用很多次,最终将导致 numOfOperation 达到其最大值,然后在下一次调用中达到零 - 这会导致除以零的错误。

现在,我想以下直接的实现可以解决问题,但是,每次检查零UINT64_MAX有点效率不高。

所以我的问题是 – 有没有更有效的方法来实现我的 updateNumberOfOperations() 方法的当前实现的功能?

谢谢家伙。

我的类的当前实现:

#include <cstdint>
class MyClass
{
    public:
        void updateNumberOfOperations()
        {
            if (UINT64_MAX == m_numOfOperations)
            {
                ++m_numOfOperations;
            }
            ++m_numOfOperations;
            m_someOtherMember = m_someOtherMember / m_numOfOperations;
        }
    private:
       uint64_t m_numOfOperations;   // how many times an operation was done
       uint64_t m_someOtherMember;  // will be divided by numOfOperations
};

您可以使用以下函数在换行时跳过 0 值来递增无符号数字:

inline uint64_t inc(uint64_t a) {
    ++a; // Wrapping unsigned numbers is well-defined. 
    return a + !a;
}

它在代码中不生成分支。

另请注意,如果您每纳秒增加一次uint64_t,则需要 ~584 年才能包裹它。