为什么不使用堆栈内存?

问题描述 投票:3回答:1

请考虑以下示例:

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

为什么要分配堆栈空间?完全不使用。可以省略pushpop。 MSVC和gcc的优化版本也为此功能使用了堆栈空间(请参见godbolt),因此必须有原因。

c++ code-generation stack-allocation
1个回答
0
投票

它分配堆栈空间,因此堆栈是16字节对齐的。这是必需的,因为返回地址占用8个字节,因此需要额外的8个字节空间来使堆栈保持16个字节对齐。

[使用gcc,如果您指定-mpreferred-stack-boundary=3选项(这意味着对齐2 ^ 3),它将不会分配以下空间:godbolt。 (此选项的默认值为4。)>

© www.soinside.com 2019 - 2024. All rights reserved.