#pragma hashome ディレクティブは、#pragma ishome で指定されるホーム・モジュールが指定されたクラスにあることをコンパイラーに通知します。 このクラスの仮想関数テーブルは、特定のインライン関数と共に、静的として生成されません。 代わりにこれらは、#pragma ishome が指定されたクラスのコンパイル単位の中で外部として参照されます。
>>-#--pragma--hashome--(--className--+------------+--)--------->< '-AllInlines-'
ここで、
className | 前述の外部参照を必要とするクラスの名前を指定します。 className はクラスでなければならず、定義されていなければなりません。 |
AllInlines | className 内から、 すべてのインライン関数を外部参照する必要があることを指定します。 この引数では大/小文字の区別はありません。 |
一致する #pragma hashome を持たない #pragma ishome がある場合は、警告が出されます。
以下の例では、コード・サンプルをコンパイルすると仮想関数テーブルと、コンパイル単位 a.o のみの S::foo() の定義が生成されます (b.o 用はありません)。これによりアプリケーションに対して生成されるコードの量が削減されます。
// 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() {}
関連情報