Может приспосабливание компилятор C# оптимизировать далеко локальное (но неиспользованный) переменная, если это - единственная сильная ссылка к объекту?

См. также эти связанные ресурсы:


Другими словами:

Может объект, на который ссылается локальная переменная быть исправленным, прежде чем переменная выйдет из объема (например, потому что переменная присваивается, но затем не используется снова), или это - объект, который, как гарантируют, будет не иметь права на сборку "мусора", пока переменная не выходит из объема?

Позвольте мне объяснить:


void Case_1()
{
    var weakRef = new WeakReference(new object());

    GC.Collect();  // <-- doesn't have to be an explicit call; just assume that
                   //     garbage collection would occur at this point.

    if (weakRef.IsAlive) ...
}

В этом примере кода я, очевидно, должен запланировать возможность что new'ed object исправлен сборщиком "мусора"; поэтому if оператор.

(Обратите внимание, что я использую weakRef для единственной цели проверить, если new'ed object все еще вокруг.)


void Case_2()
{
    var unusedLocalVar = new object();
    var weakRef = new WeakReference(unusedLocalVar);

    GC.Collect();  // <-- doesn't have to be an explicit call; just assume that
                   //     garbage collection would occur at this point.

    Debug.Assert(weakRef.IsAlive);
}

Основное изменение в этом примере кода от предыдущего - то, что new'ed object сильно ссылается локальной переменной (unusedLocalVar). Однако эта переменная никогда не используется снова после слабой ссылки (weakRef) был создан.


Вопрос: приспосабливание, из которого компилятор C# позволил оптимизировать первые две строки Case_2 в те Case_1 если это видит это unusedLocalVar используется только в одном месте, а именно, как аргумент WeakReference конструктор? т.е. есть ли любая возможность что утверждение в Case_2 мог когда-либо перестать работать?

11
задан Community 23 May 2017 в 12:08
поделиться

1 ответ

Неважно, что делает компилятор C # - JITter / GC разрешено очищать локальные ссылки, когда они больше не существуют в теле метода. Посмотрите на документы для GC.KeepAlive

Кроме того, эта презентация powerpoint , особенно начиная со слайда 30 и далее, помогает объяснить, на что способен JIT / GC.

{{1} }
12
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: