したがってinterior_ptr<typename>
、ステートメントを使用してC♯の場合とまったく同じように構造体の配列を操作するために使用できることは理解しfixed
ていますが、ヒープ上の配列を修正せず、ガベージコレクションで移動させます。ガベージコレクターが効果的に機能するのを妨げたくないので、それは良いことです。ただし、ガベージコレクターは別のスレッドで実行され、アクティブになると、ヒープ上のオブジェクトが圧縮されている間、他のすべてのスレッドが停止します。
私が次のコードを持っていると仮定します:
interior_ptr<unsigned char> sourceBufferPtr = reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0]) + sourceOffset;
コードは次のように実行する必要があります。次に例を示します。
&sourceBuffer[0]
配列の最初の項目のアドレスを返します:32。sourceOffset
:8。reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0])
アドレスをにキャストします。interior_ptr<unsigned char>
これはに追加されsourceOffset
ます。sourceBufferPtr
等しいはずです…- ガベージコレクタがアレイを移動しなかった場合は40。
- ガベージコレクターがアレイを16のような場所に移動した場合は24。
- ガベージコレクターがステップ3と4の間で配列を移動した場合、配列の位置はステップ3の後に16に更新されますが、割り当てられた結果
sourceBufferPtr
は40のままです。
ガベージコレクターがステップ3と4の間にスレッドを停止し、間違った値を割り当てる可能性がある、sourceBufferPtr
または共通言語ランタイムがステートメント全体がアトミック/値が正しいことを確認する方法を何らかの方法で知っていると仮定するのは正しいですか?何をしても安全interior_ptr<typename>
ですか?