为什么在局部函数中使用 new 运算符进行结构分配会在堆栈上增加额外空间?

逆向工程 汇编
2021-06-28 18:20:39

我决定在这个论坛上问这个问题,因为我不明白为什么结构分配会在本地函数堆栈上产生额外的 16 字节空间(第二个代码段的第三行)。

这里是c++简单代码及其对应的汇编版本

struct product {
  int weight;
} ;

void test() {
product* p;

p=new product();
p->weight=1;
}
push    rbp
mov     rbp, rsp
sub     rsp, 16
mov     edi, 4
call    operator new(unsigned long)
mov     DWORD PTR [rax], 0
mov     QWORD PTR [rbp-8], rax
mov     rax, QWORD PTR [rbp-8]
mov     DWORD PTR [rax], 1
nop
leave
ret
1个回答

将来,诸如这是用于什么架构和操作系统之类的其他信息会有所帮助,因为答案确实会有所不同。(例如,x86_64 Windows 中的 long 是 32 位,而 Linux 中是 64 位)。

然而,让我们假设这是基于使用的寄存器的 x86_64,结果在这里 long 的大小并不重要。

简短的回答是它不是结构。它是指向结构的指针。那个“p”必须去某个地方。

此外,在 MOST x86_64 操作系统中 new 返回的内容是 16 字节对齐的,出于性能原因,堆栈也是如此。所以这就是额外的 8 个字节可能来自的地方。也可能是堆栈 cookie 的空间,该空间从调试器输出中隐藏,具体取决于您从何处获得该程序集输出。