请考虑以下示例:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
为vector::empty
生成的汇编代码(通过clang,进行了优化):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
为什么要分配堆栈空间?完全不使用。可以省略push
和pop
。 MSVC和gcc的优化版本也为此功能使用了堆栈空间(请参见godbolt),因此必须有原因。
它分配堆栈空间,因此堆栈是16字节对齐的。这是必需的,因为返回地址占用8个字节,因此需要额外的8个字节空间来使堆栈保持16个字节对齐。
[使用gcc,如果您指定-mpreferred-stack-boundary=3
选项(这意味着对齐2 ^ 3),它将不会分配以下空间:godbolt。 (此选项的默认值为4。)>