のねのBlog

パソコンやソフト開発で起きた問題など書きます。よろしくお願いします。

Blittable(ブリッタブル)とmarshalling(マーシャリング)

マーシャリングのわかりやすい図が、MSDNにあった。

値渡しされるメソッド引数は、スタック上の値としてアンマネージ コードにマーシャリングされます。
コピーのプロセスは直接的です。

参照渡しされる引数は、ポインターとしてスタック上に渡されます。
参照型も、値渡しまたは参照渡しできます。
値渡しされる参照型がコピーまたは固定されるようすを次の図に示します。
マネージクライアント

  ----------         
 |スタック|          
 +---------          ---------
 |addrs   |-------->|  123   |
 ----------         ----------
  |        |             ^
  ----------             |
     |                   |
  f2(int[])              |参照型
     |                   |値渡し  
  -----------            |(固定)
  |スタック |            |
  -----------            |
  |addrs    |-------------
  -----------

アンマネージサーバー
一時的な固定は、現在のメモリ位置にデータをロックします。
したがって、共通言語ランタイムのガベージ コレクターによって、
そのデータが再配置されることを回避できます。

マーシャラーはデータを固定することでコピーによるオーバーヘッドを減少させ、パフォーマンスを向上させます。

マーシャリング プロセス中にデータがコピーされるのか固定されるのかは、
そのデータの型によって決まります。

一時的な固定は、String などのオブジェクトのマーシャリング中に
自動的に実行されますが、
GCHandle クラスを使って手動でメモリを一時的に固定することもできます。

マーシャリングの必要が無い変数をブリッタブル変数
可変長の配列はブリッタブルではありません。

引数がブリッタブル型の場合、マーシャラーはマーシャリングを行いません。
引数が値型の場合、変数のコピーがスタックに設定されます。