これはおそらく習慣的なプログラミングの冗長性です。ヘッダーで定義された一連のインターフェースで DECLSPEC_NOVTABLE ( __declspec(novtable) ) に気付きました:
struct DECLSPEC_NOVTABLE IStuff : public IObject
{
virtual method1 () = 0;
virtual method2 () = 0;
};
この__declspec 拡張属性に関するMSDN の記事では、この男を追加するとコンストラクトとデストラクターの vtable エントリが削除されるため、「コード サイズが大幅に削減される」と記載されています (vtable が完全に削除されるため)。
これは私にはあまり意味がありません。これらの人は純粋な仮想です。コンパイラがデフォルトでこれを行わないのはなぜですか?
この記事では、これを実行してから、これらのいずれかをインスタンス化しようとすると、実行時アクセス違反が発生することも述べています。しかし、いくつかのコンパイラ (__declspec 拡張機能の有無にかかわらず) でこれを試したところ、(予想どおり) コンパイルされませんでした。
だから私は要約すると思います:
- 純粋な仮想インターフェイスに関係なく、コンパイラは vtable を取り除きますか、それともここで何か基本的なことを見逃していますか?
- MSDNの記事は何について話しているのですか?