内存分配局部变量

时间:2010-03-30 02:47:36

标签: memory stack

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}
  

我们必须记住,记忆只能   用这个词的倍数来表示   尺寸。在我们的例子中,一个字是4个字节,   或32位。所以我们的5字节缓冲区是   真要占用8个字节(2个字)   内存,我们的10字节缓冲区是   要占用12个字节(3个字)   记忆。这就是SP的原因   减去20。

为什么它不是ceil((5 + 10)/ 4)* 4 = 16?

2 个答案:

答案 0 :(得分:5)

因为个别变量应该对齐。使用您提出的公式,您只需对齐堆栈上的第一个变量,使后续变量不对齐,这对性能不利。

这也称为“打包”,可以使用pragma在C / C ++中完成,但仅在非常特殊的情况下有用,并且对于性能和潜在运行时陷阱的原因都可能是危险的。某些处理器会在运行时生成未对齐访问的错误,这会使程序崩溃。

答案 1 :(得分:1)

架构上的变量是单独对齐的。 buffer1向上舍入为8,缓冲区为2到12,因此它们的起始地址都是4字节对齐的。所以8 + 12 = 20。