由于变量被更频繁地释放,使较小的函数通常在内存方面更有效吗? [关闭]

Posted

技术标签:

【中文标题】由于变量被更频繁地释放,使较小的函数通常在内存方面更有效吗? [关闭]【英文标题】:Is making smaller functions generally more efficient memory-wise since variables get deallocated more frequently? [closed] 【发布时间】:2011-08-08 23:45:59 【问题描述】:

在 C 中将工作分成 5 个函数而不是一个大函数,因为在给定时间内存中的变量更少,因为堆栈帧被更频繁地释放,因此内存效率更高吗?

鉴于有很多局部变量,并且堆栈帧来自一个集中的主,而不是在彼此的顶部创建。

我知道将函数分解为更小的函数的其他优点。请仅就内存使用情况回答这个问题。

【问题讨论】:

Java、Python 还是 C?选一个……除非你想了解他们每个人的记忆特征? @Mo Zo:不,一个答案肯定不适用于其他答案。一种语言的语法不一定与它与其他语法相似的语言共享的运行时行为有任何关系。 不,它们完全不同。更改问题,否则它可能会被关闭。 C 没有强制要求内存是如何实现的,因此您不能随意假设 实际上是一个堆栈。无论如何,这种担心几乎肯定是错位的。专注于以逻辑和可维护的方式构建您的程序,并明智地设计您的算法。我确定您要问的是不会成为您的瓶颈。 我已经进一步编辑了您的问题,使其更加清晰,并投票决定重新开放。请添加更具体的信息以及您没有刚刚测试的原因(如果有的话)。 【参考方案1】:

它非常依赖于语言和编译器。 对于像 Python 这样可以动态访问变量的语言(例如globals()['x']),您有效地减少了每个变量在可访问范围内的时间,从而允许更频繁地回收内存。根据您的操作方式,您可能会迫使解释器保留更多的作用域,而作用域本身可能会使用额外的内存。例如,如果您从 f1 中取出一个块并将其设置为 f2,然后从 f1 中调用它,那么您正在增加堆栈深度和必须保留的作用域数量。

对于具有成熟编译器(如 C)的编译语言,变量的内存通常仅在实际需要时才使用。因此,您将无法完成编译器尚未完成的工作。

请记住,当您调用函数时,需要将局部变量从寄存器移到堆栈上,以及返回地址。因此,在某些情况下,如果将其拆分为多个从原始函数中调用的函数,最终会导致更大的内存占用。 但也要意识到,如果只从一个地方调用一个函数,那么您的编译器很有可能会内联它。

因此,总而言之,这很难预测,而且影响很小。只做最易读的事情。

【讨论】:

【参考方案2】:

这就是我的理念。我认为,除非你正在做一些疯狂的科学计算,它将调用几个不同的函数数百万次(从而使系统堆栈负担过重并导致堆栈溢出),否则你最好分解你的代码(显然不要不要太疯狂)。但是分解代码,特别是在 OO 代码中,是天赐之物(尤其是对于调试和可读性)。归根结底,一切都是取舍。

实际上,现在我想起来了,如果你有相当多的变量并且堆栈来自一个集中的 main,大多数人都会相应地线程化他们的应用程序/程序。

由于我不确定您来自哪里,如果您非常注重效率,请查看此问题及其答案(与低级代码有关):

How to write fast (low level) code?

如果您实际上/字面上谈论的是包含您标记的所有语言,尽管它们都是基于 C 的语言,但它们实际上具有非常不同的内存/memarch 模型(尤其是因为 Java 在 VM 上运行)。

【讨论】:

以上是关于由于变量被更频繁地释放,使较小的函数通常在内存方面更有效吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

RTX——第18章 内存管理

从 JavaScript 中的局部变量释放内存

内存泄露 Memory Leaks 内存优化总结

释放自动释放对象不会使我的应用程序崩溃,为啥?

怎样构建更小的容器

malloc内存分配