考虑以下示例:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
为
vector::empty
生成的汇编代码(通过叮当,经过优化):push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
为什么要分配堆栈空间?它根本没有被使用。
push
和 pop
可以省略。 MSVC 和 gcc 的优化构建也为此函数使用堆栈空间(参见 godbolt 上的说明),所以一定有原因。
最佳答案
它分配堆栈空间,因此堆栈是 16 字节对齐的。它是必需的,因为返回地址需要 8 个字节,因此需要额外的 8 个字节空间来保持堆栈 16 字节对齐。
对于某些编译器,可以使用命令行参数配置堆栈帧的对齐方式。
rsp
中减去了 40 个字节。在函数的开头,这意味着其他东西也会影响它。 -mstack-alignment
选项指定堆栈对齐。似乎默认值是 16,尽管没有记录。如果将其设置为 8,堆栈分配( push
和 pop
)将从生成的汇编代码中消失。 -mpreferred-stack-boundary
选项指定堆栈对齐。如果给定的值为 N,则表示 2^N 字节对齐。默认值为 4,即 16 个字节。如果将其设置为 3(即 8 个字节),堆栈分配( sub
和 add
用于 rsp
)将从生成的汇编代码中消失。 查看 godbolt .
关于c++ - 为什么不使用时分配堆栈内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636935/