次の例を考えてみます。
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
なぜスタックスペースを割り当てるのですか?一切使用しておりません。省略することができます。MSVCとgccの最適化ビルドもこの関数にスタックスペースを使用するため(godboltを参照)、理由があるはずです。pushpop
@Bob__:いいえ。なぜ私はなぜですか?
—
グット博士
vector::size()この例では、インライン化されていないことをシミュレートするように定義されていません。
では、コンパイラが知らないものをどのように最適化できるでしょうか?
—
Bob__
@Bob__:の実装を知っていても
—
グット博士
vector::size()、スタックフレームの割り当てや割り当てには関係がないと思いますvector::empty()。でempty()、ちょうどそれが何であれ、と呼ばれています。
まあ、あなたは何かを返す関数を呼び出しているので、そのためのスペースが必要です(よくわからない場合)。
—
Bob__
thisパラメータを説明しましたか?