我可以假设递增 long 在我的一生中永远不会溢出吗?

Can I assume incrementing long will never overflow in my lifetime?

假设我正在制作游戏开发引擎。它有一个对象注册表,用于跟踪每个对象的最后更新时间。为此,我使用了一个由全局静态 class 分配的 long。像这样:

public static class GlobalRegistrar {
    // *** Static data
    private static long m_currentModTag = long.MinValue+1; // Current ModTag value
    public const long ModTagUntagged = long.MinValue;

    public static long GetNextModTag() {
        #if MULTITHREADING
            return Interlocked.Increment(ref m_currentModTag);
        #else
            return ++m_currentModTag;
        #endif
    }
    public static void UpdateModTag(ref long mtag) {
        #if MULTITHREADING
            mtag = Interlocked.Increment(ref m_currentModTag));
        #else
            mtag = ++m_currentModTag;
        #endif
    }

我用类似的东西测试 'up-to-date':

    public bool UpToDate() {
        if (m_updater == null) { return false; }
        foreach(IObj dataObj in m_dependsOn) {
            if (dataObj.MTag > m_mtag) { return false; }
        }
        return true;
    }

您大概可以填入这段代码的空白处。这是非常基础的。

我可以安全地假设 m_currentModTag 永远不会溢出吗?既然有大约 18 pentillion 个值要增加?

我的意思是,我可以想出一种允许它环绕的方法,并在 UpToDate 方法中做一些巧妙的事情,让它检测到可能的环绕,但这需要一些时间性能受到影响,而且会更丑陋。我真的需要吗?

18 pentillion,只能通过递增。我想我可以假设它在我的余生中永远不会溢出。

让我们做一些数学运算。

2^64 大约是 10^19。假设一台计算机每秒可以进行 10^10 次增量。一年大约有 10^7 秒。所以在溢出之前你应该有大约 100 年的时间,给或取一个量级。

现在你应该问自己几个问题

  • 溢出会产生什么影响?游戏和飞行器的飞行控制有非常不同的要求。
  • 您的程序预计 运行 需要多长时间?一场比赛可能不会 运行 超过几天。某些控制软件可能 运行 多年不间断。
  • 您认为您的软件会使用多长时间? 20 年后的计算机可能会更快。

在许多情况下,假设没有溢出应该没问题,但您应该在估计风险后才这样做。