Warum verkettet der Java-Compiler String-Literale nicht, wenn sie hinter einer Variablen stehen?

8

Ich habe den folgenden Testcode:

%Vor%

Der generierte Bytecode ist:

%Vor%

In testPrefix() wird der Ausdruck "a" + "b" vom Java-Compiler in das String-Literal "ab" kombiniert, aber in testSuffix() wird der Ausdruck "c" + "d" nicht zu kombiniert Kompilierzeit.

Warum kann der Compiler die String-Literale nicht in der zweiten Methode kombinieren? Die Quelldatei wurde mit dem Standard Oracle JDK 8 javac kompiliert.

    
Siqi Lin 25.02.2015, 22:08
quelle

3 Antworten

13

Weil der String-Verkettungsoperator (+) ist syntaktisch links assoziativ :

  

Zum Beispiel der Ausdruck:

%Vor%      

wird immer als Bedeutung betrachtet:

%Vor%

Zugegeben, wenn b und c Strings sind, entspricht der Ausdruck a + (b + c) . So könnte ein Compiler das tun, was Sie in dieser speziellen Situation vorschlagen , aber es ist nicht durch die Spezifikation vorgeschrieben ...

    
assylias 25.02.2015, 22:14
quelle
2

Das ist keine gute Antwort.

Die Reihenfolge der Addition ist definiert und erfolgt von links.

Dies:

%Vor%

Hat Ausgabe erwartet

%Vor%

Ich vermute also, dass der Compiler erkennt, dass Literal plus Literal auf "langes Literal" optimiert werden kann, erkennt aber nicht, dass das Umordnen der Operationen das gleiche Ergebnis hätte, so dass der ausführliche Code erzeugt wird.

    
Persixty 25.02.2015 22:16
quelle
2
%Vor%

entspricht

%Vor%

Sie könnten argumentieren, dass es diesem Ausdruck entspricht

%Vor%

wird für

optimiert %Vor%

Ich denke, dies ist der Grund, warum der Byte-Code diese Optimierung nicht enthält. Sprachspezifikation (15.18.1. String Concatenation Operator +) :

  

Das String-Objekt wird neu erstellt (§12.5), es sei denn, der Ausdruck ist ein konstanter Ausdruck (§15.28).

Mit anderen Worten, (i + "c") muss eine neue Zeichenfolge sein, und (i + "c") + "d" muss wieder eine neue Zeichenfolge sein.

Allerdings könnte ein JIT-Compiler die Optimierung intern anwenden, da er die beobachtbare Semantik nicht ändert.

    
Philipp Claßen 25.02.2015 22:25
quelle

Tags und Links