哪个在C分配/释放使用局部变量的内存方面更好?为什么?

时间:2013-05-13 22:36:37

标签: c pointers allocation memory-management

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

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

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

5 个答案:

答案 0 :(得分:3)

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

然而,你的程序已经有了自己的堆栈,所以它可以在不中断执行流程的情况下根据需要进行操作(除了你无法控制的多任务处理)。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

有充分的理由同时选择两种方式。

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

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

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

这取决于您要定位的编译器和系统。

  

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

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

答案 3 :(得分:0)

本地,非malloc调用通常会更快地分配/解除分配,因为它们只需要堆栈工作而不需要堆管理 - 并且它们具有有限范围的额外好处。但是,它们的范围有限,通常你需要你的记忆才能超越一个功能。

在某些具有有限堆栈空间的嵌入式系统上,即使在本地变量上也会调用malloc只是为了访问更大的堆,但一般来说,您希望限制内存访问其预期的范围 - 无论性能如何考虑。

答案 4 :(得分:0)

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