web-dev-qa-db-ja.com

アウトオブライン仮想メソッド

out-of-line virtual methodとは正確には何で、なぜリンク時間に影響するのですか?

LLVMコーディング標準 は言う

クラスがヘッダーファイルで定義されていて、vtable(仮想メソッドがあるか、仮想メソッドを持つクラスから派生している)がある場合、クラスには常に少なくとも1つのアウトオブライン仮想メソッドが必要です。これがないと、コンパイラーはvtableとRTTIを、ヘッダーを#includeするすべての.oファイルにコピーし、.oファイルのサイズを膨らませ、リンク時間を増やします。

42
Daniel Eggert

コンパイラーは、仮想メソッドを持つクラスのvtableを生成する必要があります。これには、これらのメソッドへのポインタが含まれています。すべての仮想メソッドがインラインである(ヘッダーで定義されている)場合、コンパイラーはvtableを出力する変換ユニット(.cppファイル)がわからないため、それらすべてにコピーを出力し、リンカーは処理を行います。それと。これにより、オブジェクトファイルで余分な作業と膨張が発生します。一方、仮想関数がアウトオブラインで定義されている場合(.cpp内)、vtableはそこに出力されるため、1つのコピーのみが出力されます。同じことがRTTIにも当てはまります。

47
Dark Falcon