3

stackalloc をいつ使用するかについて、以前の StackOverflow の投稿から例を読みました。さて、この例は私を少し当惑させました:

public unsafe void DoSomeStuff()
{
    byte* unmanaged = stackalloc byte[100];
    byte[] managed = new byte[100];

    //Do stuff with the arrays

    //When this method exits, the unmanaged array gets immediately destroyed.
    //The managed array no longer has any handles to it, so it will get 
    //cleaned up the next time the garbage collector runs.
    //In the mean-time, it is still consuming memory and adding to the list of crap
    //the garbage collector needs to keep track of. If you're doing XNA dev on the
    //Xbox 360, this can be especially bad.
}

私はまだ C# とプログラミング全般の初心者なので、間違っている場合は遠慮なく訂正してください。しかし、バイトは値型ではありませんか? また、値型は宣言された場所に格納されていませんか? これは、この例でmanagedは もスタックに格納されているということではないでしょうか。拡張により、このスタック フレームが終了し、呼び出しアドレスに移動すると、メモリは自動的にクリーンアップされるため、これmanagedと同じ方法で削除する必要があります。unmanaged例?

4

2 に答える 2

4

タイプbyte[]は に似てstackalloc byte[100]いますが、まったく異なるものを表しています。Aは、型が から派生したヒープ オブジェクトのインスタンスへの参照byte[]を保持しますが、a (さらに言えば a ) は 100 バイトを保持します。何かの型を期待するコードは、ヒープ オブジェクト参照のみを受け入れます。100 バイトを直接受け入れることはありません。すべての参照型と同様に、System.Arraystackalloc byte[100]fixed byte[100];byte[]System.Arrayあらゆる種類の参照が存在するインスタンスは、参照自体が存在する限り存在することが保証されます (オブジェクトが弱い参照を介してのみアクセス可能であることが判明した場合、それらの参照は、オブジェクトが存在しなくなる前に無効化されます。この不変式)。配列への参照が現在のスタック フレームの外側に格納されていない場合、スタック フレームが終了すると存在しなくなりますが、参照が別の場所に格納されている場合、配列は参照がある限り存続します。

于 2014-04-22T20:34:00.677 に答える