void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
Run Code Online (Sandbox Code Playgroud)
我们必须记住,内存只能以字大小的倍数来处理.在我们的例子中,一个字是4个字节,或32位.所以我们的5字节缓冲区实际上需要占用8个字节(2个字)的内存,而我们的10字节缓冲区将占用12个字节(3个字)的内存.这就是SP被减去20的原因.
为什么它不是ceil((5 + 10)/ 4)*4 = 16?
因为个别变量应该对齐.使用您提出的公式,您只需对齐堆栈上的第一个变量,使后续变量不对齐,这对性能不利.
这也称为"打包",可以使用pragma在C/C++中完成,但仅在非常特殊的情况下才有用,并且对于性能和潜在运行时陷阱的原因都可能是危险的.某些处理器会在运行时生成未对齐访问的错误,这会使程序崩溃.