:: Не фоксом единым
Перемещаемая переменная
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
На msdn.microsoft.com сказано:

Цитата:
Оператор fixed не позволяет сборщику мусора переносить перемещаемую переменную.

На msdn.microsoft.com сказано:

Цитата:
Если переменная является перемещаемой, можно использовать фиксированное предложение, чтобы временно зафиксировать переменную перед получением ее адреса.

Что такое "перемещаемая переменная"? Это погрешности кривого перевода или в C# действительно есть такое понятие?
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
По английски

Цитата:
If the variable is a moveable variable, you can use the fixed statement to temporarily fix the variable before obtaining its address.

moveable variable
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Точно так же как и в фоксе, значение переменной хранится в некотором блоке памяти в "куче", а кучей этой управляет исполняющая система. И в некоторый момент времени она запросто может решить переместить данные из одного места памяти в другое. Ну тривиально после сборки мусора в ранее "плотненько забитом" всеми этими объектами блоке памяти образуется множество мелких, или не очень мелких "дырок" - происходит фрагментация и системе становится сложно выделить новую память под новые объекты (т.е. формально имеем 1Гб "свободной" памяти, а из-за миллиона 4-8 байтных "переменных" равномерно разбросанных по этой самой памяти, не можем выделить даже один 100Мбный блок).
Т.к. "управляемый код" находится под 100% контролем среды исполнения, то он никак не заметит того что эта переменная ещё 3 строки назад была по адресу 0x0ff01230, а вот прямо сейчас она уже находится по адресу 0x02001000 - он не работает непосредственно с "адресами памяти".
А вот НЕуправляемый код как раз и работает с адресами, и подобное "перемещение" его попросту сломает. Вот чтобы известить рантайм о том что мы собираемся получить "адрес" и отдать его неуправляемому коду, и что пока мы будем с этим адресом работать, объект там хранящийся нельзя трогать - и служит конструкция fixed.
В фоксе для точно такой же цели в LCK (наборе функций для конструирования fll библиотек или "специфических" ActiveX-ов) есть функция _HLock() для "фиксации" ну и парная ей _HUnLock() для "освобождения" соответствующего хендла.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Поскольку C# это управляемый код, то все переменные в нём являются перемещаемыми, пока перед ними не укажут fixed. Так?
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
А вот НЕуправляемый код как раз и работает с адресами, и подобное "перемещение" его попросту сломает. Вот чтобы известить рантайм о том что мы собираемся получить "адрес" и отдать его неуправляемому коду, и что пока мы будем с этим адресом работать, объект там хранящийся нельзя трогать - и служит конструкция fixed.

Любой код на C# - это управляемый? И, "небезопаный код" (или, как говорится на сайте MS код в небезопасном контексте/режиме) - это ведь то же "управляемый код"?




На msdn.microsoft.com сказано:

Цитата:
В небезопасном режиме память выделяется стеку, где сборка мусора не производится и, соответственно, закрепление не требуется.

Т.е. если переменная объявлена до unsafe, то внутри блока unsafe надо при получении адреса этой переменной использовать fixed. А если переменная объявлена внутри unsafe, то можно сразу получать адрес этой переменной.



Исправлено 1 раз(а). Последнее : S-type, 22.03.17 09:36
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Хотя, чуть выше приводится пример:

unsafe static void TestMethod()
{
// Assume that the following class exists.
//class Point
//{
// public int x;
// public int y;
//}
// Variable pt is a managed variable, subject to garbage collection.
Point pt = new Point();
// Using fixed allows the address of pt members to be taken,
// and "pins" pt so that it is not relocated.
fixed (int* p = &pt.x)
{
*p = 1;
}
}

Получается, переменная pt объявлена внутри unsafe, но fixed зачем то указывается.
Ratings: 0 negative/0 positive
Re: Перемещаемая переменная
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да, я немного ошибся в терминологии - конечно же не "неуправляемый", а "небезопасный" - т.е. код в котором используются указатели и адресная арифметика. А уж будет внутри этого кода вызываться неуправляемый код (через p-invoke) или нет - значения не имеет.
S-type
А если переменная объявлена внутри unsafe, то можно сразу получать адрес этой переменной.
Нет, в общем случае нужен fixed. Вот если сразу объявлен тип указателя и проинициализирован с использованием stackalloc, то никаких fixed не требуется - т.к. stackalloc выделяет "неперемещаемую" память (в стеке, а не в куче). "Обычные" переменные работают внутри unsafe так же как и в safe контексте.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 6 (Гостей: 6)

© 2000-2024 Fox Club 
Яндекс.Метрика