4

マネージド/アンマネージドアレイの相互運用性では、通常のアレイの相互運用性がない場合があります

fixed (byte* data = new byte[length])
{
    // work with the array
}

むしろ、次のように、参照のみを取得する配列を固定したいと思います。

IntPtr dataPtr = camera.Image2d.GetDataBuffer();
fixed (byte* data = (byte *)dataPtr)
{
   // work with the array
}

1)私の理解では、「fixed」はメモリ位置をメモリマネージャの低レベルに固定し、それを指すオブジェクトを気にしないため、下のコードも機能するはずです。(つまり、「ルート」/直接ポインターはありません。おそらくそのような概念はありませんが。)

もう1つの質問:

2)「fixed」を使用するための要件は、実行されたコードと同時に実行されているCLRメモリマネージャーから来ているため、いつでも配列を移動できますか?

4

1 に答える 1

3

1)2番目のfixedキーワードは、実際のオブジェクトではなく、ポインターを固定しようとしているキーワードを使用しているため、適切ではないようです。そしてIntPtr、(afaik)マネージド・ポインターではなく、アンマネージド・ポインターです。

2)fixed指定された管理変数へのポインターを作成します。また、ピン留めしないと、GCが変数を別のメモリ位置に再配置する可能性があるため、ポインタが使用できなくなります。

msdnから:

固定ステートメントは、管理対象変数へのポインターを設定し、ステートメントの実行中にその変数を「固定」します。固定されていないと、ガベージコレクションによって変数が予期せず再配置される可能性があるため、移動可能な管理変数へのポインターはほとんど役に立ちません。C#コンパイラでは、固定ステートメントで管理変数へのポインタのみを割り当てることができます。

于 2013-02-06T09:12:19.327 に答える