1

これはおそらく習慣的なプログラミングの冗長性です。ヘッダーで定義された一連のインターフェースで DECLSPEC_NOVTABLE ( __declspec(novtable) ) に気付きました:

struct DECLSPEC_NOVTABLE IStuff : public IObject
{
    virtual method1 () = 0;
    virtual method2 () = 0;
};

この__declspec 拡張属性に関するMSDN の記事では、この男を追加するとコンストラクトとデストラクターの vtable エントリが削除されるため、「コード サイズが大幅に削減される」と記載されています (vtable が完全に削除されるため)。

これは私にはあまり意味がありません。これらの人は純粋な仮想です。コンパイラがデフォルトでこれを行わないのはなぜですか?

この記事では、これを実行してから、これらのいずれかをインスタンス化しようとすると、実行時アクセス違反が発生することも述べています。しかし、いくつかのコンパイラ (__declspec 拡張機能の有無にかかわらず) でこれを試したところ、(予想どおり) コンパイルされませんでした。

だから私は要約すると思います:

  • 純粋な仮想インターフェイスに関係なく、コンパイラは vtable を取り除きますか、それともここで何か基本的なことを見逃していますか?
  • MSDNの記事は何について話しているのですか?
4

2 に答える 2

1

これは、愚かなコンパイラ/リンカにとってはちょっとした手掛かりです。この vtable が不要であることは明らかであるため、コンパイラはこの vtable への参照を挿入しないでください。コンパイラは、リンカーが vtable を削除できるように参照をマークすることもできますが、もちろんそれはより複雑です。

于 2009-03-12T09:02:07.293 に答える