2017-01-12 22 views
2

はこれについて何かを見つけることができませんが、私はFOOが参照されていない、私はバーが内に固定保持されていることを確信することができ、このC#の固定領域の最適化

fixed(Foo* foo=bar) { 
    doSomething(bar); // not foo 
} 

のようなコードを見つけた場合最適化のために行っていないのですか?

+1

えー、本当に** C ** **、そうではありません、** C ** ** ** C++ **ですか? –

+0

私にはC#のように見えるhttps://msdn.microsoft.com/en-us/library/f58wzh21.aspx – prof1990

+0

ポインタ 'foo'を使わないと固定' 'bar''のポイントを見ることができません(ただし、ポイントガベージコレクタを少し効率的にすることです) – Slai

答えて

4

はい。また、明細書中で述べたように、それは、fixed文の全体のポイントは次のとおり固定ステートメントは、アドレスによって参照される変数が影響を受けないことを保証固定ポインタ初期によって算出された各アドレスについて

固定ステートメントの期間、ガベージコレクタによる再配置または廃棄。たとえば、固定ポインタ初期化子によって計算されたアドレスが、オブジェクトまたは配列インスタンスの要素のフィールドを参照する場合、その固定されたステートメントは、そのオブジェクトインスタンスの存続期間中に再配置または廃棄されないことを保証します。ステートメント。あなたのケースでは

固定ポインター初期化子barです。文法上の理由から、fooの宣言が必要です。これはおそらく配列barが移動不可能でなければならないが、実際にポインタを必要としないこのイディオムの理由です。

片側の注意:barをそのようなfixed文の外のメモリ位置から移動できる最適化ではありません。それは、もはや断片化されていないことを保証するためにヒープを圧縮するガベージコレクタです。私はそれを最適化と呼んでいません。

+0

あなたの精巧な答えをありがとう。仕様のグーグルな部分から、私は違うように見えるこのポストを見つけました:http://stackoverflow.com/questions/5589945/net-c-sharp-unsafe-fixed-doesnt-pin-passthrough-array-element それは固定領域はオブジェクトを固定しないが、GCが変更できるオフセットを挿入すると説明しています。これは狂ったように聞こえます - それは.NETのドキュメントやそれに類するもののどこかで確認できますか? – beyond

+0

しかし、私が正しく見ると、それは別のケースです。彼らは配列に含まれている構造体のプロパティを固定しようとしています。これは物事が奇妙になるようです。 – Joey