考虑以下示例:
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),因此必须有一个原因。
@Bob__:不,我为什么要?
—
Gut博士
vector::size()
在示例中未定义来模拟未内联。
那么,编译器如何优化它不知道的东西?
—
Bob__
@Bob__:我认为,了解的实现
—
Gut博士
vector::size()
与为分配或不分配堆栈框架无关vector::empty()
。empty()
无论它是什么,在其中都被称为。
好吧,您正在调用一个返回某些内容的函数,因此您需要空间(如果您不知道更好的话)。
—
Bob__
this
参数?