我能假设在我的一生中,递增的长度永远不会溢出吗



假设我正在制作一个游戏开发引擎。它有一个对象注册表,可以跟踪每个对象上次更新的时间。为此,我使用了一个由全局静态类分配的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
}

我用测试"最新">

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个五分之一的值要递增?

我的意思是,我可以想出一种方法让它进行环绕,并在UpToDate方法中做一些巧妙的事情,让它检测可能的环绕,但这会对性能造成一些影响,而且会更难看。我真的需要吗?

1800万,仅通过递增。我想我可以假设它在我的余生中永远不会溢出。

让我们做一些数学运算。

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

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

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

在许多情况下,假设没有溢出应该是可以的,但只有在估计风险后才能这样做。

最新更新