Ist der Null-Conditional-Operator für mehrere aufeinanderfolgende Verwendungsstellen optimiert oder führt er zu doppelten Überprüfungen?

8

Kopiert die Verwendung des Null-bedingten Operators Null-Checks? Zum Beispiel

%Vor%

Wird das in folgendes übersetzt:

%Vor%

Oder das?

%Vor%

Wenn Ersteres, macht es einen Unterschied, ob es zwischen beiden Zeilen einen anderen Code gibt? Mit anderen Worten, wie intelligent ist der Compiler / Optimierer?

    
Nelson Rothermel 25.01.2016, 03:07
quelle

3 Antworten

6

Der Compiler scheint davon ziemlich unwissend zu sein.

Der Code:

%Vor%

... wird als nicht optimiert für:

kompiliert %Vor%

... und optimiert als:

%Vor%

Beide eindeutig mit zwei Zweigüberprüfungen.

    
Enigmativity 25.01.2016, 03:12
quelle
5

Es werden zwei separate If..Else-Prüfungen für die Zuweisung durchgeführt, die in Ihrem Fall einen bedingten Operator von null verwenden. Unten ist ein disassemblierter Beispielcode

Quellcode:

%Vor%

Zerlegter Code (ILSpy):

%Vor%

Ich habe int als Typ der Eigenschaft verwendet, aber das obige sollte für jeden anderen Fall gelten.

    
Martin 25.01.2016 03:16
quelle
5

Der Compiler ist streng, denke über diesen Code nach.

%Vor%

Das erwartete Ergebnis ist: x == 1, y is null . Wenn der Compiler jedoch den Code mit einer if -Anweisung optimiert, wird ein NullReferenceException ausgegeben. Das bedeutet, dass die Verwendung einer if -Anweisung keine intelligente Optimierung ist, es ist keine Optimierung, weil sie FALSCH ist.

    
Danny Chen 25.01.2016 03:47
quelle

Tags und Links