Blittable(ブリッタブル)とmarshalling(マーシャリング)
マーシャリングのわかりやすい図が、MSDNにあった。
値渡しされるメソッド引数は、スタック上の値としてアンマネージ コードにマーシャリングされます。 コピーのプロセスは直接的です。 参照渡しされる引数は、ポインターとしてスタック上に渡されます。 参照型も、値渡しまたは参照渡しできます。 値渡しされる参照型がコピーまたは固定されるようすを次の図に示します。マネージクライアント ---------- |スタック| +--------- --------- |addrs |-------->| 123 | ---------- ---------- | | ^ ---------- | | | f2(int[]) |参照型 | |値渡し ----------- |(固定) |スタック | | ----------- | |addrs |------------- ----------- アンマネージサーバー一時的な固定は、現在のメモリ位置にデータをロックします。 したがって、共通言語ランタイムのガベージ コレクターによって、 そのデータが再配置されることを回避できます。 マーシャラーはデータを固定することでコピーによるオーバーヘッドを減少させ、パフォーマンスを向上させます。 マーシャリング プロセス中にデータがコピーされるのか固定されるのかは、 そのデータの型によって決まります。 一時的な固定は、String などのオブジェクトのマーシャリング中に 自動的に実行されますが、 GCHandle クラスを使って手動でメモリを一時的に固定することもできます。
マーシャリングの必要が無い変数をブリッタブル変数
可変長の配列はブリッタブルではありません。引数がブリッタブル型の場合、マーシャラーはマーシャリングを行いません。
引数が値型の場合、変数のコピーがスタックに設定されます。