我有一个程序执行以下操作
它会这样做几次然后退出。
我并不关心程序的内存占用,只关心执行时间。
如果不释放帐户上的内存,它可能实际上需要更多时间来处理免费/删除,而不仅仅是跳过它并转到下一步,这是不是一件坏事。
最后,程序将退出,不再重要了。
我知道唯一可以确定的方法是在我的计算机上做一些基准测试,但我对理论上的利弊感兴趣。
注意:让我们假设一个现代操作系统将在退出时清理内存。
答案 0 :(得分:3)
是否释放已分配的内存将是性能上的赢或输取取决于您的分配模式以及如何使用内存。如果您free
,将来的malloc
可能最终会重复使用之前malloc
的内存。这样可以节省时间,因为不必从操作系统获取旧内存,它可能会在缓存中。页面错误和缓存未命中可能会使事情变慢。
如果您关心这一点,请对程序的释放和非释放变体进行基准测试。
答案 1 :(得分:2)
存在许多潜在问题。例子包括;
malloc()
使用的数据结构),如果内存未释放,分配本身可能会减慢。这可能会导致程序无法满足时序约束,因为它会分配更多内存。在不再需要时释放内存可以缓解此类问题(尽管存在其他影响,例如内存碎片)。最重要的是,如果您完全关心程序性能或时序,那么分配内存而不是解除分配它是一种非常差(和懒惰)的策略。如果你真的关心程序性能/时序,你实际上根本不会动态分配内存。
如果您正在使用动态内存分配,那么即使您不关心内存占用,最好还是在不再需要时释放它。根据具体情况,如果正确释放内存,您可能会发现程序运行得更快或更慢(这取决于众多变量,包括我上面提到的变量等等)。并且,如果您需要在更大的程序中重用代码 - 实际上,在现实世界中经常发生 - 如果您的代码没有发布,您更有可能遇到问题(内存问题,性能问题)记忆得当。
答案 2 :(得分:1)
你在哪里分配内存?,堆栈还是堆? 在你的情况下,我会建议你在堆栈上分配你的东西(即不使用任何内存分配函数)。
但是,大多数操作系统在程序退出时取消分配堆的份额。 如果您正在使用堆,并且您正在使用现代C ++编码, 你想在Smart pointers上阅读。
创建堆栈对象的性能最低,它们是基于范围的(甚至更冷)。唯一的缺点是空间非常有限。
另一种技术是最初在堆上预分配一块内存;并管理分配的使用空间,这在Emulators中很常见。
答案 3 :(得分:0)
这几乎不取决于您运行程序的位置,大多数现代操作系统将清除程序在退出时分配的内存。因此,只要您不分配大额金额,就不会有任何问题。
但如果你在嵌入式工作,这可能不是真的。
编辑:如果操作系统在执行后清除内存,那么唯一的问题可能是您分配的内存超过可用内存。但只要这不会发生,我就不会在那里看到问题。现在一些程序是常见的做法。
答案 4 :(得分:0)
在程序终止之前,您应始终释放所有已分配的内存,原因有多种。
此外,在C ++中,您应避免需要“手动”内存取消分配并依赖RAII方法,例如标准库通过其容器提供的方法和智能指针。