JVM系列之(十)对于一个很复杂的常量表达式,编译器会算出结果再编译吗?

解答:

  • 把常量表达式的值求出来作为常量嵌在最终生成的代码中,这种优化叫做常量折叠(constant folding)。
  • 语言规范要求做常量折叠的情况Java例如说在Java语言中:

    1.Java原始类型(byte、boolean、short、char、int、float、long、double)以及java.lang.String的字面量

    2.声明为static final的Java原始类型或java.lang.String类型的静态字段,并且带有以常量表达式来初始化的情况(如果没有初始化表达式或者初始化表达式不是常量表达式的话则不算)

    3.声明为final修饰的原始类型或java.lang.String类型的局部变量,并且带有以常量表达式来初始化的情况(类似于上一条)

    4.以常量表达式为操作数的算术和关系运算表达式,以及String拼接运算符(’+’)

  • 下面的表达式都是语言规范强制要求的常量表达式:
 1         // int literal, type: int, value: 1
1.0       // double literal, type: double, value: 1.0d
"foobar"  // string literal, type: java.lang.String, value: "foobar"
"foo" + 1 // constant string concatenation expression, type: java.lang.String, value: "foo1"
1 < 2     // constant relational expression, type: boolean, value: true
  • 像这样的情况,Java语言编译器(例如javac、ECJ)在遇到相关的运算符时,必须要检查其操作数是否都为常量表达式,如果是的话就必须在编译时对该运算符做常量折叠。

猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/79966931