如果内存占用不是问题,我应该为短期程序释放内存吗?

时间:2017-01-26 08:24:03

标签: c++ c performance memory-management

我有一个程序执行以下操作

  1. 分配内存(堆)
  2. 做一些处理
  3. 分配更多内存(堆)
  4. 做一些处理
  5. 它会这样做几次然后退出。

    我并不关心程序的内存占用,只关心执行时间。

    如果不释放帐户上的内存,它可能实际上需要更多时间来处理免费/删除,而不仅仅是跳过它并转到下一步,这是不是一件坏事。

    最后,程序将退出,不再重要了。

    我知道唯一可以确定的方法是在我的计算机上做一些基准测试,但我对理论上的利弊感兴趣。

    注意:让我们假设一个现代操作系统将在退出时清理内存。

5 个答案:

答案 0 :(得分:3)

是否释放已分配的内存将是性能上的赢或输取取决于您的分配模式以及如何使用内存。如果您free,将来的malloc可能最终会重复使用之前malloc的内存。这样可以节省时间,因为不必从操作系统获取旧内存,它可能会在缓存中。页面错误和缓存未命中可能会使事情变慢。

如果您关心这一点,请对程序的释放和非释放变体进行基准测试。

答案 1 :(得分:2)

存在许多潜在问题。例子包括;

  • 如果您无法提前预测实际需要多少内存 - 这是使用动态内存的最常见原因之一 分配 - 然后你的程序可能耗尽可用内存(由于系统内存耗尽,或者主机操作系统对你的程序施加配额)。后 它可能会或可能不会按要求的速度运行,但(甚至忽略 时间问题)可能会运行不正确并产生错误 结果。无论主机系统有多少内存,或主机系统为其承载的程序强制执行的配额,都无关紧要 - 可以用尽这笔钱。
  • 并非所有操作系统都会在程序退出时释放内存。并且,在这些中,存在未完全释放内存的可能性 - 两者都是由于操作系统本身的错误,以及由于程序的操作(例如,分配与其他程序共享的资源)。在这种情况下,如果您的程序运行了几次,您可能会发现该程序(第32次运行[选择一个随机数]左右)会莫名其妙地失败。
  • 当程序分配更多内存时,根据动态内存分配的管理方式(例如malloc()使用的数据结构),如果内存未释放,分配本身可能会减慢。这可能会导致程序无法满足时序约束,因为它会分配更多内存。在不再需要时释放内存可以缓解此类问题(尽管存在其他影响,例如内存碎片)。
  • 如果你养成了不动态释放的习惯 分配内存,你也可能(因为“效率”的类似原因) 不用费心去检查分配是否成功 - 毕竟,这也需要时间。这会导致问题,如果分配失败(例如异常的程序终止,破坏内存,在没有警告的情况下产生错误的结果等)。

最重要的是,如果您完全关心程序性能或时序,那么分配内存而不是解除分配它是一种非常差(和懒惰)的策略。如果你真的关心程序性能/时序,你实际上根本不会动态分配内存。

如果您正在使用动态内存分配,那么即使您不关心内存占用,最好还是在不再需要时释放它。根据具体情况,如果正确释放内存,您可能会发现程序运行得更快或更慢(这取决于众多变量,包括我上面提到的变量等等)。并且,如果您需要在更大的程序中重用代码 - 实际上,在现实世界中经常发生 - 如果您的代码没有发布,您更有可能遇到问题(内存问题,性能问题)记忆得当。

答案 2 :(得分:1)

你在哪里分配内存?,堆栈还是堆? 在你的情况下,我会建议你在堆栈上分配你的东西(即不使用任何内存分配函数)。

但是,大多数操作系统在程序退出时取消分配堆的份额。 如果您正在使用堆,并且您正在使用现代C ++编码, 你想在Smart pointers上阅读。

创建堆栈对象的性能最低,它们是基于范围的(甚至更冷)。唯一的缺点是空间非常有限。

另一种技术是最初在堆上预分配一块内存;并管理分配的使用空间,这在Emulators中很常见。

答案 3 :(得分:0)

这几乎不取决于您运行程序的位置,大多数现代操作系统将清除程序在退出时分配的内存。因此,只要您不分配大额金额,就不会有任何问题。

但如果你在嵌入式工作,这可能不是真的。

编辑:如果操作系统在执行后清除内存,那么唯一的问题可能是您分配的内存超过可用内存。但只要这不会发生,我就不会在那里看到问题。现在一些程序是常见的做法。

答案 4 :(得分:0)

在程序终止之前,您应始终释放所有已分配的内存,原因有多种。

  1. 这通常被认为是最佳做法。
  2. 目前还不清楚是否有任何好处(在执行速度方面)让你在运行时间后清理。
  3. 如果运行时环境无法收集所有内存,则可以避免内存泄漏。
  4. 如果您扩展此程序或构建它,内存泄漏可能会扩散到其他代码中。
  5. 此外,在C ++中,您应避免需要“手动”内存取消分配并依赖RAII方法,例如标准库通过其容器提供的方法和智能指针。