3

安全でないコンテキストで、次のようなコードがあります。

 ValidatePartialOperation(array, startingOffset, runLength);

 fixed (double* _op = array)
 {
     double* op = _op + startingOffset;
     callSomething(op, runLength);
 }

そして、そのコピーをいくつかの異なる場所に貼り付けました。しかし、私はそのような検証とポインター演算を複数の場所に置くのは嫌いなので、ロジックを次のような 1 行にまとめたいと思います。

 double* op = preCall(array, startingOffset, runLength);
 callSomething(op, runLength);
 postCall(array);

またはさらに良い:

 using (double* op = preCall(array, startingOffset, runLength))
 {
     callSomething(op, runLength);
 }

しかし、何が起こっても、「修正済み」バージョンからパフォーマンスを失うわけにはいきません。

私の今の計画は、fixed ステートメントが行っていることを模倣することですが、実際にはそれが何であるかはわかりません。おそらく、固定操作を伴ういくつかの try-catch ブロックですか?

4

5 に答える 5

0

メモリの圧縮中にガベージ コレクターがオブジェクトを再配置できない問題が修正されました。使用しない場合、オブジェクトはいつでも移動でき、ポインタは無効になります。

于 2013-04-15T19:00:45.833 に答える
0

いいえ、そんなことはありません。MSDN が言うように: Fixedステートメントは、ガベージ コレクターがメモリを移動するのを防ぐため、固定ポインターは必要な限り有効なままになります。これは、管理されていないリソースを使用している場合に重要です。私の現在の知識では、それを any usingtry/catch/finallyまたは他のものに置き換えることはできません。

于 2013-04-15T19:01:50.057 に答える
0

fixed変数を固定して、ガベージ コレクターがfixedブロックの間オブジェクトを移動できないようにします。

ドキュメントによると:

C# コンパイラでは、fixed ステートメント内のマネージド変数にポインターを割り当てることしかできません。

fixedしたがって、コード内でステートメントを使用して回避できない可能性があります。

于 2013-04-15T19:01:58.963 に答える