Est-ce que les sommes précalculer du compilateur Java de littéraux?
-
29-09-2019 - |
Question
int i = 10 + 20;
Est-il vrai que le compilateur traitera ce code, en ajoutant 10 + 20
, et le code d'octets est le même que pour cette ligne de code?
int i = 30;
Où puis-je lire à ce sujet?
La solution
Oui, et vous pouvez même le vérifier par vous-même. Prenez un petit fichier Java, par exemple:
public class Main {
public Main() {
int i = 10 + 20;
}
}
Compile avec javac Main.java
, puis exécutez javap -c Main
de le démonter:
Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: bipush 30
6: istore_1
7: return
}
Il est clair que dans le bytecode, vous pouvez voir l'optimisation du compilateur: bipush 30
Autres conseils
Oui. Cette optimisation du compilateur est appelé pliage constante href="http://en.wikipedia.org/wiki/Constant_folding". Il y a une autre optimisation du compilateur appelé clairsemée propagation conditionnelle constant qui fait quelque chose de similaire.
En général, il n'y a aucune garantie qu'un compilateur donné sera effectivement plier des constantes, mais de nos jours à peu près tous compilateur pour toutes les langues fait cela. En particulier, le Java Language Specification exige que expressions constantes évaluées au moment de la compilation.
Oui, il sera simplifié comme l'exige les JLS de (grâce à des @EJP pour cette précision).
Si vous voulez plus de ressources et l'optimisation des javac vous devriez jeter un oeil à optimisations du compilateur ou Java compilateurs.
Une autre chose intéressante est que même si votre code est optimisé lors de la compilation, une seconde optimisation se fera lors de l'exécution avec hotspot .
Ressources:
Sur le même sujet: