C 静态内存分配和动态内存分配哪个更高效

C 静态内存分配和动态内存分配哪个更高效,c,sockets,memory,heap-memory,C,Sockets,Memory,Heap Memory,如果我必须在c中使用128/64字节字符数组。哪一种是更有效的字符数组静态分配还是动态内存分配?为什么?如果我必须为1kb或mare分配内存,这也是有效的吗 我想知道哪一个更有效1还是2。 1.字符数组[128]或 2.char*abc=malloc(128) 静态分配,我假设您的意思是使用关键字Static,发生在链接时间。在运行时,除了对程序加载时间的可能影响外,它基本上是零成本 没有比这更有效的了 编辑 堆栈分配通过递增和递减寄存器来实现。它的效率低于static,但比使用运行时内存分配库

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

我想知道哪一个更有效1还是2。
1.字符数组[128]或

2.char*abc=malloc(128)

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

没有比这更有效的了

编辑


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

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

没有比这更有效的了

编辑



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

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

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

定义“高效”是什么意思。@Dayalrai这根本不是“高效”的意思。高效意味着我的代码应该运行得更快。直到您有一个大部分时间都在
malloc()内的代码为止。
,我建议不要再担心它的效率。堆和堆栈分配有两个截然不同的用途,在几乎所有的上下文中,用途都决定了使用哪种分配方案。例如,您不能从函数返回堆栈分配的数组,因此这就是指定
malloc()
的目的。分配从来不是一个速度问题,除非您不断重复分配相同的内存。问题状态为“静态分配”,但是,1)和2)都不表示静态分配。定义“高效”是什么意思@Dayalrai这根本不是“高效”的意思。高效意味着我的代码应该运行得更快。除非你的代码大部分时间都花在
malloc()
,否则我建议你不要再担心它的效率。堆和堆栈分配有两个截然不同的用途,在几乎所有的上下文中,用途都决定了使用哪种分配方案。例如,您不能从函数返回堆栈分配的数组,因此这就是指定
malloc()
的目的。分配从来不是一个速度问题,除非您不断重复分配相同的内存。问题状态为“静态分配”,但1)和2)都不表示静态分配。No not static关键字。我想知道哪一个更有效1或2。1.字符数组[128]或2。char*abc=malloc(128);这没有什么“静态”的。这是堆栈分配。有趣的是,真正的静态分配在运行时的成本并不一定比
malloc()
分配低。对静态分配的第一次访问很可能涉及页面错误,这远远不是零成本,并且可能低于
malloc()
重新使用堆中以前出现错误的部分的成本。从实际意义上讲,这种差异并不重要。我认为,这种可能性与在堆上进行分配,然后将堆换出,然后导致访问堆上的数据时出现页面错误的可能性大致相同。@caf和堆栈探测导致页面错误的可能性大致相同。这不是一个有用的东西来考虑这三个之间的任何区别。我想知道哪一个更有效1或2。1.字符数组[128]或2。char*abc=malloc(128);这没有什么“静态”的。这是堆栈分配。有趣的是,真正的静态分配在运行时的成本并不一定比
malloc()
分配低。对静态分配的第一次访问很可能涉及页面错误,这远远不是零成本,并且可能低于
malloc()
重新使用堆中以前出现错误的部分的成本。从实际意义上讲,这种差异并不重要。我认为这与在堆上进行分配,然后交换堆,然后导致访问堆上的数据时出现页面错误差不多。@c