不,我真的很认真。
我刚刚目睹有人将一个函数本地的变量移动到全局状态,并提交消息“Relieve the stack”。
是否真的有理由做这类事情?
答案 0 :(得分:10)
首先,将变量放在全局变量中并不会直接提高CPU使用率。堆栈初始化通常是函数入口/出口处的单个加/减,与堆栈帧大小无关。
但是,如果函数需要一个非常大的工作集,最好把它放在堆栈以外的东西上;堆栈的大小通常相当有限。通常的选择是堆;但是这需要时间来分配和释放,所以如果你要经常调用这个功能,它可能会很昂贵。这也是嵌入式系统的一个问题,它们可能没有适当的堆实现。
因此,如果堆是一个问题,全局变量可以是一个解决方案。但是,它们有它们自己的缺点 - 特别是,你不希望同时有多个线程弄乱全局数据,也不能在不花费太多精力的情况下通过这个函数递归,或者递归位可能会损坏较早的调用函数。
因此,这种技术在某些情况下可能会有所帮助。但是,由于线程问题,我不建议将它作为第一选择使用。
此外,对于它的价值,您可以使用static
变量获得相同的记忆效果。我建议使用这些,否则你最终会污染全局命名空间。
答案 1 :(得分:3)
围绕这个全局变量的神话使你的程序“更快”。那是废话。
但是,如果使用大型静态数组,则可能不希望将其放在堆栈上以防止堆栈溢出的风险。与整体逻辑存储空间相比,堆栈存储器相当小。
在设计良好的大于100 LOC的程序中,您可能希望使用其他方式分配大量数据:将其放入对象(std :: vector等)或使用malloc / free,new /删除。
答案 2 :(得分:0)
如果变量被声明为static
,则可能没有区别。
如果不是,则会有更少的堆栈推送和弹出,但程序的行为可能会改变。
答案 3 :(得分:0)
使用全局变量而不是函数参数将减少调用函数所需的堆栈空间。这可能是评论的起源。但由于所有全局变量都贯穿整个程序的持续时间,因此程序的整体RAM消耗将更高。
这不是神话,很多种系统都有缓慢的堆栈。在PC或其他类似的高端32/64位CPU上,效果将更不明显(原始帖子中没有任何内容表示PC)。
全局变量而非参数通常是非常糟糕的做法,因为它会导致意大利面条。为避免这种情况,应将此类变量声明为静态。
如果您有这个选项,那么在调用函数时减少堆栈空间的最佳做法是内联。
答案 4 :(得分:0)
如果您担心递归中的堆栈溢出,并且全局变量可以解决您的问题,那么有一个更好的解决方案:将所有变量放在最外层包装函数中的struct
中以进行递归,并传递一个指向该结构的指针到实际的递归函数。这种方法为您提供了全局变量的所有好处,并没有任何缺点。
另请注意,在具有位置无关代码和共享库的现代系统上,访问全局变量通常比访问局部变量或通过单个指针间接访问结构的成员更慢 GOT相对寻址的成本和类似的。
除非你真的需要拥有全局状态,否则不要使用全局变量,即使这样,也要尝试消除它。永远不要将全局变量引入“优化”。
答案 5 :(得分:-4)
是否真的有一些理由 做这种事情?
没有