3

如果我需要进行字符串操作或操作任何类型的数组,无论是标准类型,如 int 还是自定义数据结构。什么是更好的局部变量或动态分配和取消分配内存?

我知道,如果您使用的是局部变量,则不需要分配/取消分配内存,这可能会使我们免于内存泄漏。但我想知道为什么人们喜欢使用动态分配内存。它只是一种编码风格还是真的有它的好处。它还取决于我们正在编译的系统还是取决于编译器?

即使系统有足够的内存和速度资源,哪种技术更适合优化代码?

4

5 回答 5

3

就速度而言,本地堆栈分配操作几乎总是胜过动态内存分配。原因是,在动态内存分配过程中,您的程序需要向操作系统寻求帮助。这会导致上下文切换(非常缓慢/昂贵),并阻塞直到操作系统返回一块内存(它甚至可能无法返回)。

但是,您的程序已经拥有自己的堆栈,因此它可以在不中断执行流程的情况下根据需要对其进行操作(除了无论如何都无法控制的多任务处理)。

动态内存分配的好处是有时我们直到运行时才知道需要分配多少。如果没有动态分配,我们需要预先分配一个静态缓冲区,并为最坏的情况保留足够的内存(我们可能有也可能没有足够的资源)。

于 2013-05-13T23:15:49.493 回答
2

在这件事上你应该问的问题是:我知道程序在运行时需要的内存大小吗?

如果您知道您只需要 3 个 int 变量,那么您应该选择局部变量。没有内存泄漏,除非有足够的可用内存,否则您的程序将无法运行。

如果您无法预测需要多少内存,假设您需要将文件读入内存,那么您别无选择,只能进行动态分配。

于 2013-05-13T22:43:42.183 回答
2

有充分的理由将两者都作为选项。

通常,您将在以下情况下使用堆分配(例如malloc):

  • 在执行之前您不知道所需的分配大小
  • 当它消耗大量堆栈内存(或全部)时
  • 当分配需要超出当前范围时(例如从函数返回)

它还取决于我们正在编译的系统还是取决于编译器?

这取决于编译器和您所针对的系统。

即使系统有足够的内存和速度资源,哪种技术更适合优化代码?

更重要的是在大多数情况下您需要如何使用和访问内存和硬件。局部变量对于优化更有优势。malloc但是,在某些情况下,编译器可能会优化对 的调用。

于 2013-05-13T22:50:11.717 回答
0

本地、非 malloc 调用通常会更快地分配/取消分配,因为它们只需要堆栈工作而不需要堆管理 - 而且它们具有有限范围的额外好处。但是,它们的范围有限,并且您通常需要您的记忆力超出功能范围。

在一些堆栈空间有限的嵌入式系统上,甚至在本地变量上调用 malloc 只是为了访问更大的堆,但通常,您希望将内存访问限制在预期的范围内 - 无论性能考虑如何。

于 2013-05-13T22:39:21.523 回答
0

作为默认位置,除非您需要分配比创建它的范围更长,或者分配很重要,否则优先使用堆栈分配。在您的情况下,您询问的是一个局部变量,它可能应该在封闭范围的末尾被释放。一个经验法则是,如果分配小于1K,堆栈是合适的,否则堆。Microsoft_malloca使用此阈值在堆栈和堆分配之间切换。当然,很大程度上取决于您期望堆栈处于什么状态以进行分配。例如,深度递归函数中的 1K 堆栈分配可能不明智。

于 2013-05-13T22:57:19.480 回答