我可以假设递增 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 年后的计算机可能会更快。
在许多情况下,假设没有溢出应该没问题,但您应该在估计风险后才这样做。
假设我正在制作游戏开发引擎。它有一个对象注册表,用于跟踪每个对象的最后更新时间。为此,我使用了一个由全局静态 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 年后的计算机可能会更快。
在许多情况下,假设没有溢出应该没问题,但您应该在估计风险后才这样做。