3

したがってinterior_ptr<typename>、ステートメントを使用してC♯の場合とまったく同じように構造体の配列を操作するために使用できることは理解しfixedていますが、ヒープ上の配列を修正せず、ガベージコレクションで移動させます。ガベージコレクターが効果的に機能するのを妨げたくないので、それは良いことです。ただし、ガベージコレクターは別のスレッドで実行され、アクティブになると、ヒープ上のオブジェクトが圧縮されている間、他のすべてのスレッドが停止します。

私が次のコードを持っていると仮定します:

interior_ptr<unsigned char> sourceBufferPtr = reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0]) + sourceOffset;

コードは次のように実行する必要があります。次に例を示します。

  1. &sourceBuffer[0]配列の最初の項目のアドレスを返します:32。
  2. sourceOffset:8。
  3. reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0])アドレスをにキャストします。interior_ptr<unsigned char>これはに追加されsourceOffsetます。
  4. sourceBufferPtr等しいはずです…
    • ガベージコレクタがアレイを移動しなかった場合は40。
    • ガベージコレクターがアレイを16のような場所に移動した場合は24。
    • ガベージコレクターがステップ3と4の間で配列を移動した場合、配列の位置はステップ3の後に16に更新されますが、割り当てられた結果sourceBufferPtrは40のままです。

ガベージコレクターがステップ3と4の間にスレッドを停止し、間違った値を割り当てる可能性がある、sourceBufferPtrまたは共通言語ランタイムがステートメント全体がアトミック/値が正しいことを確認する方法を何らかの方法で知っていると仮定するのは正しいですか?何をして安全interior_ptr<typename>ですか?

4

1 に答える 1

3

ガベージコレクターがステップ3と4の間でスレッドを停止し、sourceBufferPtrに間違った値を割り当てる可能性があると想定するのは正しいですか?

はい、コードが正しくないためです。配列要素への変更されていないポインターを取得した後にreinterpret_castを使用することにより、GCがポインターを無効にする機会を導入します。次のように中断せずにinterior_ptrを使用する必要があります。

interior_ptr<unsigned char> bufferPtr = &sourceBuffer[0];
interior_ptr<unsigned char> sourceBufferPtr = bufferPtr + sourceOffset;

この新しいコードには、interior_ptrのみが含まれています。2番目の割り当ての右側にある一時的なものでさえinterior_ptrです。

于 2012-05-19T21:57:00.640 に答える