В Интернете есть много статей, в которых перечислены оптимизации, сделанные C# JIT, перед выполнением части кода. Например this post на MSDN говорит о:Содержит ли C# JIT-компилятор нулевую проверку?
Constant складывании, постоянное и копии распространения Общих подвыражения выбывания движения Код инвариантов цикла, Мертвого магазина и мертвого код исключения, распределение регистров, методы встраивания, Loop разворачивая (небольшие петли с малыми телами).
Мой вопрос: компилятор JIT имеет дело с бесполезными нуль-чеками? Я не могу найти источник, рассматривающий этот вопрос.
В той же статье я прочитал:
поскольку спецификация C# языка гарантирует, что любой вызов на ссылке на объект нулевой бросает NullReferenceException, каждый вызов сайт должны обеспечить экземпляр не является нулевым. Это делается путем разыменования справки экземпляра ; если он равен нулю, он будет генерировать ошибку, которая равна , превратившемуся в это исключение.
Итак, предположим, что я пишу кусок кода, как это:
if (person != null)
{
Console.WriteLine(person.Name);
}
В person.Name
звонки снова второй нуль-проверить, что это Клири бесполезно, и компилятор может удалить его. Или нет?
Я прочитал, что на Java это уже сделано (некоторые источники между многими here, here и here).
Если C# тоже это делает, знаете ли вы какой-то источник или документацию, которые об этом говорят?
Если вместо этого C# не делает этого, вы знаете, почему? Есть ли внутренняя трудность в реализации такой функции для среды .NET, с которой JIT Java не сталкивается?
Только как побочный эффект обычной оптимизации, такой как устранение мертвого кода. Это должно быть довольно редко.В целом оптимизатор дрожания не имеет специального знания о коде, выполняющем проверку нулевого указателя, и рассматривает указатели как изменчивые. Довольно важно в любой VM с сборщиком мусора, который произвольно изменяет указатели, когда он уплотняет кучу. Примечательно, что сам компилятор C# может исключить проверку, он делает это, когда вы используете оператор elvis ('? .'). –