2012-03-26 17 views
0

私の質問は純粋な仮想クラス(インターフェイス)を持っていても現在のアクティブなビルドのために、派生クラスが1つしかコンパイルされていない場合でもvtableが作成されますか?純粋仮想クラス、1つの派生クラス、まだvtable?

class Foo 
{ 
    virtual void bar() = 0; 
} 
#if 1 
class Foo_1 : public Foo 
{ 
void bar() {cout<<"foo_1";} 
} 
#else 
class Foo_2 : public Foo 
{ 
void bar() {cout<<"foo_2";} 
} 
#endif 

この場合、vtableは必要ありません。

これは最適化されますか、それでもvtableのオーバーヘッドがありますか?

thx

+0

'virtual'関数へのポインタはどこに行くのですか? – cHao

+0

コンパイラがここで何かを最適化すると、 'class Nasty:public Foo {void bar(){}};'で 'nasty.cpp'ファイルを追加します。 –

+0

@ R. Martinho Fernandes、あなたはその声明に合っていますが、それはコンパイル時に分かっていることです...もしFooから派生した複数のクラスであれば、それらはvtableでなければなりません。しかし、(私の場合のように)それらが唯一のものなら、あなたは本当にそれを必要としませんか?またはあなたですか? – moiself

答えて

0

あなたはまだvtableを取得します。結局のところ、クラスFooが他の翻訳単位で使用されるかどうかは、コンパイラが分かりません。または、ライブラリとしてパッケージ化し、他のユーザーはFooから派生します。再び、コンパイラはアプリオリを知らない。

class Foo_3 : public Foo_1 { 
    void bar() { Foo_1::bar(); ... } 
} 

すべてのコードが同じである場合:(あなたのサンプルコードの内容は、ヘッダーにある場合)のク​​ラスは常にサブクラス化することができますので、あなたはおそらく、vtableのオーバーヘッドを得るでしょう

+0

翻訳単位は、リンクタイムコードの生成時に廃止された用語です。 – ConfusedSushi

+2

@ConfusedSushi翻訳単位は公式の用語です。私はその数が時代遅れだとは思わない。 –

+0

翻訳単位は翻訳ではなく、最適化で何かをしなければなりません。最適化は実装定義であり、コンパイラ/リンカはvtableを最適化することができます。 – ConfusedSushi

0

コンパイラはそれをすべて理解することができます。

1

これは可能性がありますリンク時最適化(ただし、明らかにコンパイル時に行うことはできません)。

関連する問題