Перемещаемая переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
На msdn.microsoft.com сказано:
Цитата: На msdn.microsoft.com сказано: Цитата: Что такое "перемещаемая переменная"? Это погрешности кривого перевода или в C# действительно есть такое понятие? |
Re: Перемещаемая переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
По английски
Цитата: moveable variable |
Re: Перемещаемая переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Точно так же как и в фоксе, значение переменной хранится в некотором блоке памяти в "куче", а кучей этой управляет исполняющая система. И в некоторый момент времени она запросто может решить переместить данные из одного места памяти в другое. Ну тривиально после сборки мусора в ранее "плотненько забитом" всеми этими объектами блоке памяти образуется множество мелких, или не очень мелких "дырок" - происходит фрагментация и системе становится сложно выделить новую память под новые объекты (т.е. формально имеем 1Гб "свободной" памяти, а из-за миллиона 4-8 байтных "переменных" равномерно разбросанных по этой самой памяти, не можем выделить даже один 100Мбный блок).
Т.к. "управляемый код" находится под 100% контролем среды исполнения, то он никак не заметит того что эта переменная ещё 3 строки назад была по адресу 0x0ff01230, а вот прямо сейчас она уже находится по адресу 0x02001000 - он не работает непосредственно с "адресами памяти". А вот НЕуправляемый код как раз и работает с адресами, и подобное "перемещение" его попросту сломает. Вот чтобы известить рантайм о том что мы собираемся получить "адрес" и отдать его неуправляемому коду, и что пока мы будем с этим адресом работать, объект там хранящийся нельзя трогать - и служит конструкция fixed. В фоксе для точно такой же цели в LCK (наборе функций для конструирования fll библиотек или "специфических" ActiveX-ов) есть функция _HLock() для "фиксации" ну и парная ей _HUnLock() для "освобождения" соответствующего хендла. ------------------ WBR, Igor |
Re: Перемещаемая переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Поскольку C# это управляемый код, то все переменные в нём являются перемещаемыми, пока перед ними не укажут fixed. Так?
|
Re: Перемещаемая переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Любой код на C# - это управляемый? И, "небезопаный код" (или, как говорится на сайте MS код в небезопасном контексте/режиме) - это ведь то же "управляемый код"? На msdn.microsoft.com сказано: Цитата: Т.е. если переменная объявлена до unsafe, то внутри блока unsafe надо при получении адреса этой переменной использовать fixed. А если переменная объявлена внутри unsafe, то можно сразу получать адрес этой переменной. Исправлено 1 раз(а). Последнее : S-type, 22.03.17 09:36 |
Re: Перемещаемая переменная | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Хотя, чуть выше приводится пример:
Получается, переменная pt объявлена внутри unsafe, но fixed зачем то указывается. |
Re: Перемещаемая переменная | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, я немного ошибся в терминологии - конечно же не "неуправляемый", а "небезопасный" - т.е. код в котором используются указатели и адресная арифметика. А уж будет внутри этого кода вызываться неуправляемый код (через p-invoke) или нет - значения не имеет.
Нет, в общем случае нужен fixed. Вот если сразу объявлен тип указателя и проинициализирован с использованием stackalloc, то никаких fixed не требуется - т.к. stackalloc выделяет "неперемещаемую" память (в стеке, а не в куче). "Обычные" переменные работают внутри unsafe так же как и в safe контексте. ------------------ WBR, Igor |
© 2000-2024 Fox Club  |