Вопрос

У нас есть похожий на приведенный ниже код в одном из наших проектов.Кто-нибудь может объяснить (простым английским языком), зачем здесь нужен фиксированный оператор?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
Это было полезно?

Решение

Он фиксирует указатель в памяти.Языки, собирающие мусор, имеют свободу перемещать объекты по памяти для повышения эффективности.Все это прозрачно для программиста, потому что на самом деле они не используют указатели в "обычном" CLR-коде.Однако, когда вам действительно требуются указатели, вам нужно зафиксировать это в памяти, если вы хотите с ними работать.

Другие советы

Тот Самый фиксированный оператор "закрепит" переменную в памяти, чтобы сборщик мусора не перемещал ее при сборе.Если бы он переместил переменную, указатель стал бы бесполезным, и когда вы использовали бы его, вы пытались бы получить доступ или изменить что-то, чего не собирались делать.

Он нужен вам везде, где вы выполняете арифметику указателей, чтобы сборщик мусора не перемещал его на вас.

Поскольку вы работаете в небезопасном режиме (указатель), фиксированная инструкция выделяет для этой переменной определенное пространство памяти.Если вы не поместили фиксированную инструкцию, сборщик мусора мог переместить в памяти переменную куда угодно, когда захочет.

Надеюсь, это поможет.

MSDN есть очень похожий пример.Оператор fixed в основном блокирует сборку мусора.В .Net, если вы используете указатель на ячейку памяти, среда выполнения может в любой момент перераспределить объект в "лучшее" место.ПОЭТОМУ, если вы хотите получить прямой доступ к памяти, вам нужно зафиксировать это на месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top