我编写了一个代码片段,将 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 字节对齐吗?