2017-01-12 21 views
2

Не можете найти что-нибудь об этом, но если я нахожу код, как этотC# фиксированная область оптимизации

fixed(Foo* foo=bar) { 
    doSomething(bar); // not foo 
} 

где Foo не ссылается, я могу быть уверен, что бар сохраняется фиксированной внутри региона и не ушли из-за оптимизации?

+1

Эх, это действительно ** C# **, не, скажем, ** C ** или ** C++ **? –

+0

выглядит как C# для меня https://msdn.microsoft.com/en-us/library/f58wzh21.aspx – prof1990

+0

Я не вижу никакой точки фиксированного «бара» без использования указателя 'foo' (если только точка это сделать сборщик мусора немного менее эффективным) – Slai

ответ

4

Да. Вот вся суть fixed заявления, а также отмечено в описании:

Для каждого адреса, вычисленного в фиксированной указателю-инициализаторе неподвижная оператор гарантирует, что переменная ссылается адрес не подлежит перемещение или удаление сборщиком мусора на срок действия фиксированного заявления. Например, если адрес, вычисленный инициализатором фиксированного указателя , ссылается на поле объекта или элемента экземпляра массива, фиксированный оператор гарантирует, что экземпляр содержащего объекта не будет перемещен или удален в течение всего срока службы заявление.

В вашем случае фиксированных стрелочный инициализатор является bar. Однако по причинам грамматики требуется объявление foo. Вероятно, это причина этой идиомы, когда массив bar должен быть нецелесообразным, но вам не нужен указатель.

Одностороннее примечание: это не оптимизация, которая может перемещать bar вдали от ее расположения памяти за пределами такого заявления fixed. Это сборщик мусора, уплотняющий кучу, чтобы убедиться, что он больше не фрагментирован. Однако я бы не назвал это оптимизацией.

+0

Спасибо за ваш сложный ответ. Из области поиска в Google, я наткнулся на этот пост, который, кажется, отличается: http://stackoverflow.com/questions/5589945/net-c-sharp-unsafe-fixed-doesnt-pin-passthrough-array-element Это объясняет, что фиксированная область не привязывает объект, а вставляет смещение, которое может изменить GC. Это звучит безумно - можно ли это проверить где-то в документах .NET или подобных? – beyond

+0

Это другой случай, если я правильно посмотрю. Они пытаются привязать свойство структуры, которое содержится в массиве, что, похоже, делает вещи странными. – Joey