为什么 GCC 为本地 C 结构分配“太多”堆栈空间?

时间:2021-06-29 11:31:29

标签: c++ gcc x86 x86-64 stack-frame

我编写了一个代码片段,将 C++ 对象存储在一个包含在结构体中的 char 数组中,目的是将它传递给一个用 C 编写的函数:

class cpp_type
{
public:  
  // ...

private:
  int _state;
};

struct c_type
{ char buf[4]; };

struct c_type make_c_type()
{
  c_type tmp;
  new (tmp.buf) cpp_type();
  return tmp;
}

然后我很好奇编译器如何将 make_c_type 翻译成 x86_64 汇编代码。 GCC(经过优化)产生:

0000000000000000 <_Z11make_c_typev>:
   0:   48 83 ec 18             sub    $0x18,%rsp
   4:   48 8d 7c 24 0c          lea    0xc(%rsp),%rdi
   9:   e8 00 00 00 00          call   e <_Z11make_c_typev+0xe>
   e:   8b 44 24 0c             mov    0xc(%rsp),%eax
  12:   48 83 c4 18             add    $0x18,%rsp
  16:   c3                      ret

我很困惑为什么堆栈指针减少了 24 个字节并且 rdi 设置为 rsp + 12。结构本身只有 4 个字节大,为什么 GCC 不输出 e.g. sub $0x4,%rsp 后跟 mov %rsp,%rdi?此外,堆栈不应该始终保持 16 字节对齐吗?

0 个答案:

没有答案