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