class A{
void virtual a(){}
};
int main() {
std::cout<<sizeof(A);
}
上記の場合、なぜコンパイラは関数を非仮想にし、割り当てられたスペースを節約しないのですか? そうしない具体的な理由はありますか?
コンパイラ固有の場合、gcc 4.7 コンパイラを使用しています。
class A{
void virtual a(){}
};
int main() {
std::cout<<sizeof(A);
}
上記の場合、なぜコンパイラは関数を非仮想にし、割り当てられたスペースを節約しないのですか? そうしない具体的な理由はありますか?
コンパイラ固有の場合、gcc 4.7 コンパイラを使用しています。
別の翻訳モジュールで派生クラスを作成できるためです。
理論的には、これはリンク時に解決できますが、これには多くの作業が必要になるため、実際には発生しません (AFAIK)。
適切なコンパイラは、他のファイルの内容を知らないため、おそらくこれを行いません。
リンカはこれを実行できるかもしれませんが、A の子孫バージョンがどこかに存在せず、別のモジュールにロードされるという保証はありません。
あなたの書いていることは本当ですか?最適化されたビルドでの証拠は何ですか?
私の観察では、プログラムに A の単一インスタンスを作成するコードが含まれている場合、VMT はプログラムとリンクされておらず、仮想を含む関数も使用されていません。