#pragma ishome ディレクティブは、指定したクラスのホーム・モジュールが現行のコンパイル単位であることをコンパイラーに通知します。ホーム・モジュールは、仮想関数テーブルなどの項目が保管されている場所です。項目は、コンパイル単位の外側から参照されると、そのホームの外部には生成されません。これにより、アプリケーション用に生成されるコードの量を削減することができます。
ここで、
className | ホームが現行のコンパイル単位になるクラスのリテラル名です。 |
#pragma hashome と一致しない #pragma ishome がある場合は、警告が出されます。
以下の例では、コード・サンプルをコンパイルすることにより、仮想関数テーブル、およびコンパイル単位 b.o ではなく、a.o のみの S::foo() の定義が生成されます。これにより、アプリケーション用に生成されるコードの量が削減されます。
// a.h struct S { virtual void foo() {} virtual void bar(); }; // a.C #pragma ishome(S) #pragma hashome (S) #include "a.h" int main() { S s; s.foo(); s.bar(); } // b.C #pragma hashome(S) #include "a.h" void S::bar() {}