2
class A{
     void virtual a(){}
};
int main() { 
    std::cout<<sizeof(A);
}

上記の場合、なぜコンパイラは関数を非仮想にし、割り当てられたスペースを節約しないのですか? そうしない具体的な理由はありますか?

コンパイラ固有の場合、gcc 4.7 コンパイラを使用しています。

4

3 に答える 3

8

別の翻訳モジュールで派生クラスを作成できるためです。

理論的には、これはリンク時に解決できますが、これには多くの作業が必要になるため、実際には発生しません (AFAIK)。

于 2013-07-01T17:27:24.613 に答える
2

適切なコンパイラは、他のファイルの内容を知らないため、おそらくこれを行いません。

リンカはこれを実行できるかもしれませんが、A の子孫バージョンがどこかに存在せず、別のモジュールにロードされるという保証はありません。

于 2013-07-01T17:30:51.033 に答える
0

あなたの書いていることは本当ですか?最適化されたビルドでの証拠は何ですか?

私の観察では、プログラムに A の単一インスタンスを作成するコードが含まれている場合、VMT はプログラムとリンクされておらず、仮想を含む関数も使用されていません。

于 2013-07-01T17:37:33.733 に答える