12

プロジェクトの 1 つに、次のようなコードがあります。ここで固定ステートメントが必要な理由を誰でも (簡単な英語で) 説明できますか?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
4

5 に答える 5

17

ポインタをメモリに固定します。ガベージ コレクション言語には、効率を高めるためにオブジェクトをメモリ内で自由に移動できます。プログラマーは「通常の」CLR コードではポインターを実際には使用しないため、これはすべて透過的です。ただし、ポインターが必要な場合は、それらを操作する場合はメモリ内で修正する必要があります。

于 2008-09-30T14:49:04.460 に答える
9

fixed ステートメントは、変数をメモリに「固定」して、ガベージ コレクターが収集時に変数を移動しないようにします。変数を移動した場合、ポインターは役に立たなくなり、それを使用すると、意図しないものにアクセスまたは変更しようとします。

于 2008-09-30T14:48:25.520 に答える
7

ガベージ コレクターがポインターを移動するのを防ぐために、ポインター演算を行う場所であればどこでも必要です。

于 2008-09-30T14:47:17.740 に答える
2

unsafe モード (ポインター) で実行しているため、fixed 命令は特定のメモリ空間をその変数に割り当てます。固定命令を配置しなかった場合、ガベージ コレクターは必要に応じて変数をメモリ内のどこにでも移動できます。

この助けを願っています。

于 2008-09-30T14:48:38.907 に答える
2

MSDNにも非常によく似た例があります。fixed ステートメントは、基本的にガベージ コレクションをブロックします。.Net では、メモリの場所へのポインターを使用すると、ランタイムはオブジェクトをいつでも「より適切な」場所に再割り当てできます。SOメモリに直接アクセスしたい場合は、その場で修正する必要があります。

于 2008-09-30T15:00:37.643 に答える