強いリンクの型(Delphi)
Delphi コンパイラ指令のリスト:インデックス への移動
種類 |
スイッチ |
構文 |
{$STRONGLINKTYPES ON} または {$STRONGLINKTYPES OFF} |
デフォルト |
{$STRONGLINKTYPES OFF} |
スコープ |
グローバル |
説明
この指令は最終的な EXE または DLL のリンク方法に影響を及ぼします。 確実に機能するように、指令はメイン プログラムまたはライブラリ ソース(.dpr)になければなりません。 これは、パッケージ(BPL)ではなくプログラム(EXE)やライブラリ(DLL)にのみ影響を及ぼします。
{$STRONGLINKTYPES ON} が指定されると、EXE や DLL のルート型テーブルに含まれているすべての型が(弱いフィックスアップではなく)強いフィックスアップとリンクされます。 ルート型テーブルは、RTTI ユニットが修飾名を型にマッピングできるようにするインデックスです。 スマート リンカは、弱いフィックスアップからのみ参照されているシンボル(型に関連する RTTI を含む)を削除します。 シンボルを参照している強いフィックスアップが 1 つ以上ある場合、そのシンボルは最終的なバイナリに組み込まれ、弱い参照は @PointerToNil に設定されません。
以下に例を示します。
uses Rtti;
var
c: TRttiContext;
begin
Writeln(Length(c.GetTypes));
end.
(出力: 344)
このプログラムは、使用可能な、つまり実行可能ファイルにリンクされているパブリック型の数を出力します。 パブリック型とは、QualifiedName を持ち、System.Rtti.TRttiContext.FindType を使って名前で検索でき、IsPublicType が True を返すような型です。 使用可能な型の数は通常、コードでそれらの型がどう参照されているかによって異なります。プログラムのソースで直接使用されていない型に関連する RTTI をスマート リンカが削除しようとするからです。
しかし、リンカは型への間接参照を検出できません。たとえば、System.Rtti.TRttiContext.FindType を使って型を名前で検索するような場合です。
高度なシナリオでは、逆シリアル化のように、型が直接参照されずに名前でのみ検索される場合があります。 このような状況では、ソースで手動で参照して強制的にリンクしなくてもすべての型にアクセスできるとよいでしょう。 以下のように {$STRONGLINKTYPES ON} を指定すると、そのような効果があります。
uses Rtti;
{$STRONGLINKTYPES ON}
var
c: TRttiContext;
t: TRttiType;
begin
Writeln(Length(c.GetTypes));
end.
(出力: 2203)
この指令はスマート リンカの働きを大きく損なうため、実行可能ファイルのサイズが増大するおそれがあります。実行可能ファイルに組み込まれる RTTI(その RTTI で参照されるメソッドのコードやそれらのメソッドで参照されるコードなども含む)が増えるからです。