为什么 GCC 为 C 数组分配了太多堆栈 space

Why is GCC allocating too much stack space for a C array

考虑以下程序:

int main()
{
   int arr[8];
}

在 linux20 上使用 gcc 9.3.0 编译时,文件的反汇编在开头看起来像这样(这不是上面代码的整个汇编!):

┌ 72: int dbg.main (int argc, char **argv, char **envp);
│           ; var int[8] arr @ rbp-0x30
│           ; var int64_t canary @ rbp-0x8
│           0x00001169      f30f1efa       endbr64                     ; test.c:2 { ; int main();
│           0x0000116d      55             push rbp
│           0x0000116e      4889e5         mov rbp, rsp
│           0x00001171      4883ec30       sub rsp, 0x30

arr 只有 8 个整数 = 8 * 4 字节长 (sub rsp, 0x30) 时,为什么汇编程序在堆栈上分配 0x30 = 48 个字节?

那是:

  • 32 字节的数组

  • 8 个字节用于 stack canary

  • 另外8个字节确保.

总计:48 字节。