Оптимизирует ли компилятор оператор Null Coalescing при использовании для самостоятельного назначения? - PullRequest
9 голосов
/ 23 июня 2011

Эти два кодовых блока функционально совпадаютноль.Но потом я подумал, что, возможно, компилятор оптимизирует эти собственные назначения.Кто-нибудь знает, заметит ли компилятор, что происходит, и по сути преобразует нижний фрагмент в верхний?

Ответы [ 2 ]

5 голосов
/ 23 июня 2011

Для сравнения я попытался скомпилировать

object myObj = null;
myObj = myObj ?? new object();

и

object myObj = null;
if(myObject == null)
{
  myObj = new object();
}

внутри метода Main.(Я использую MonoDevelop 2.4 на Mono 2.6.7)

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

.method public static  hidebysig 
       default void Main (string[] args)  cil managed 
{
    .entrypoint
    .maxstack 3
    .locals init (
            object  V_0)
    IL_0000:  ldnull 
    IL_0001:  stloc.0 
    IL_0002:  ldloc.0 
    IL_0003:  dup 
    IL_0004:  brtrue IL_000f

    IL_0009:  pop 
    IL_000a:  newobj instance void object::'.ctor'()
    IL_000f:  stloc.0 
    IL_0010:  ret 
}

и для второй версии:

.method public static  hidebysig 
       default void Main (string[] args)  cil managed 
{
    .entrypoint
    .maxstack 1
    .locals init (
            object  V_0)
    IL_0000:  ldnull 
    IL_0001:  stloc.0 
    IL_0002:  ldloc.0 
    IL_0003:  brtrue IL_000e

    IL_0008:  newobj instance void object::'.ctor'()
    IL_000d:  stloc.0 
    IL_000e:  ret 
}

Итак, первая версия (с использованием оператора нулевого слияния) имеетгенерируется немного больше IL.

Но есть две вещи, на которые нужно обратить внимание:Visual Studio, это вполне может быть другая история.Возможно, это оптимизировано в Microsoft с компилятором.И даже если с ними то же самое, компилятор другого человека может легко оптимизировать это.То, что что-то для некоторых компиляторов выполняется, вовсе не означает, что вы ожидаете этого от каждого компилятора.

CLR использует JIT.Даже если бы он не был оптимизирован во время компиляции, он, вероятно, был бы оптимизирован во время выполнения.На самом деле, это вполне может быть причиной того, что компиляция не так озабочена такой микрооптимизацией.
3 голосов
/ 23 июня 2011

Только что попробовал в LinqPad:

void Main()
{
    MyObj myObj = null;
    myObj = myObj ?? new MyObj();
}

Это дает следующий IL:

IL_0000:  ldnull      
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  dup         
IL_0004:  brtrue.s    IL_000C
IL_0006:  pop         
IL_0007:  newobj      UserQuery+MyObj..ctor
IL_000C:  stloc.0     

Таким образом, кажется, что присвоение (stloc.0 в IL_000C) выполнено независимо от того, было ли myObj нулевым ... но, возможно, JIT оптимизирует это позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...