c++ - 如果内存占用不是问题,我应该为一个短暂的程序释放内存吗?

标签 c++ c performance memory-management

<分区>

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

  1. 分配内存(堆)
  2. 做一些处理
  3. 分配更多内存(堆)
  4. 做一些处理

它会这样做几次然后退出。

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

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

最后,程序会退出,也就无所谓了。

我知道唯一可以确定的方法是在我的计算机上进行一些基准测试,但我对理论上的优缺点很感兴趣。

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

最佳答案

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

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

底线是,如果您非常关心程序性能或时序,分配内存而不取消分配内存是一种非常糟糕(而且懒惰)的策略。如果您真的关心程序性能/时序,您实际上根本不会动态分配内存。

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

关于c++ - 如果内存占用不是问题,我应该为一个短暂的程序释放内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869354/

相关文章:

c++ - glVertexAttribPointer stride GL_INVALID_VALUE opengl 3.3

c++ - 错误 - c 占用临时地址

C++ 强化学习库

javascript - 如何使用 Excel JavaScript API office Add-IN 最大限度地提高表行添加 50K+ 行的性能

r - 是否有更快的方法来计算 r 中栅格堆栈的中位数?

c++ - CUDA 简单数组搜索 - 共享内存

C++ 类成员函数到 C 结构函数指针

c - 尝试理解 printf() 的 gcc 汇编输出

创建固定大小数组的每个可能值

python - 最好的高并发Python/Redis服务器