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?
答案 0 :(得分:5)
因为个别变量应该对齐。使用您提出的公式,您只需对齐堆栈上的第一个变量,使后续变量不对齐,这对性能不利。
这也称为“打包”,可以使用pragma在C / C ++中完成,但仅在非常特殊的情况下有用,并且对于性能和潜在运行时陷阱的原因都可能是危险的。某些处理器会在运行时生成未对齐访问的错误,这会使程序崩溃。
答案 1 :(得分:1)
架构上的变量是单独对齐的。 buffer1向上舍入为8,缓冲区为2到12,因此它们的起始地址都是4字节对齐的。所以8 + 12 = 20。