【问题标题】:Which one is more efficiency, static memory allocation or dynamic memory allocation哪个效率更高,静态内存分配还是动态内存分配
【发布时间】:2015-05-06 09:25:47
【问题描述】:

如果我必须在 c 中使用 128/64 字节字符数组。哪一个是更有效的 char 数组的静态分配或动态内存分配,为什么?如果我必须为 1kb 或母马分配内存,这是否也有效。

我想知道 1 和 2 哪个效率更高。
1.char数组[128]或
2. 字符 *abc = malloc(128);

【问题讨论】:

  • 定义“高效”是什么意思。
  • @Dayalrai 这根本不是“高效”的意思。
  • 高效意味着我的代码应该运行得更快。
  • 在您的代码大部分时间都花在malloc() 中之前,我建议您不要担心它的效率。堆和堆栈分配有两个非常不同的目的,几乎在所有情况下,目的都决定了您使用哪种分配方案。例如,您不能从函数返回堆栈分配的数组,因此这是一个指定malloc() 的目的。除非您一遍又一遍地分配相同的内存,否则分配永远不是速度问题。
  • 问题是“静态分配”,但是 1) 和 2) 都不是静态分配。

标签: c sockets memory heap-memory


【解决方案1】:

静态分配,我假设您的意思是使用关键字static,发生在链接时。在运行时,除了对程序加载时间的可能影响之外,它基本上是零成本。

没有比这更高效的了。

编辑

堆栈分配是通过递增和递减寄存器来进行的。它的效率低于static,但比使用运行时内存分配库要高效得多。

【讨论】:

  • 没有非静态关键字。我想知道 1 或 2 哪个效率更高。 1. char array[128] 或 2. char *abc = malloc(128);
  • 这没有什么“静态”的。它是 stack 分配。见编辑。
  • 有趣的是,真正的静态分配不一定比malloc() 分配在运行时的成本更低。对静态分配的第一次访问很可能涉及页面错误,这远非零成本,并且可能低于malloc() 重新使用堆中先前出现故障的部分的成本。并不是说这种差异在实际意义上会很重要。
  • 我看到的可能性与在堆上分配相同,然后将堆换出,然后导致页面错误访问堆上的数据。
  • @caf 和堆栈探测导致页面错误一样可能。认为这三者之间的区别没有什么用处。
【解决方案2】:

堆栈分配比 malloc() 更有效,因为它只是堆栈指针的增量,而 malloc() 涉及操作系统和我们无法控制的幕后处理。对于相对较小的变量使用堆栈,除非有其他原因不使用,例如在函数超出范围后需要内存存在。对非常大的变量使用动态分配以避免堆栈溢出问题。什么是非常大的?取决于您的 CPU 和堆栈大小。对于 Windows 工作,我在堆栈上放了少于几 K 的任何东西。对于像 AVR 这样的小型嵌入式 CPU,这可以是 255 或更少 - 再次取决于您分配的堆栈大小。

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2016-02-01
    • 2011-08-31
    • 2015-07-23
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多