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

12人阅读 评论(0) 收藏 举报
分类:

解答:

  • 把常量表达式的值求出来作为常量嵌在最终生成的代码中,这种优化叫做常量折叠(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)在遇到相关的运算符时,必须要检查其操作数是否都为常量表达式,如果是的话就必须在编译时对该运算符做常量折叠。
查看评论

JVM编译器的编译过程

一、编译器概述 本片文章叙述的是HotSpot虚拟机的编译过程,HotSpot包含一个解释器javac和两个即时编译器,它们之间配合工作。 解释器与编译器: 1、解释器与编译器两者各有优势,当...
  • tingfeng96
  • tingfeng96
  • 2016-08-20 15:21:23
  • 2279

C++ - 使用 编译器常量 代替 预处理常量 详解

使用编译器常量代替预处理常量 详解   本文地址: http://blog.csdn.net/caroline_wendy/article/details/15809051 对于单纯常量, 可以使用c...
  • u012515223
  • u012515223
  • 2013-11-13 09:41:18
  • 2351

计算复杂数学表达式的值

S = (2^2/(1*3))*(4^2/(3*5))*.....(2n)^2*(2n-1)*(2n+1) 例如,输入n = 100时,函数的值为1.566893 代码如下: #include ...
  • yang6464158
  • yang6464158
  • 2014-03-02 16:30:51
  • 840

JAVA编译器常量

编译器常量的特点就是:它的值在编译期就可以确定。比如:   final int i = 5;   再傻的编译器也能在编译时看出它的值是5,不需要到运行时。对于运行时常量,它的值虽然在运行时...
  • zzm628
  • zzm628
  • 2016-03-12 07:22:32
  • 257

关于不同编译器sizeof()结果不同

关于字节对齐不再详细介绍,但是最近在linux下开发,发现linux下与windows下编译出现的结果却不一样。 struct tmp{ char a; double b; }; ...
  • thornbirdxb
  • thornbirdxb
  • 2013-09-25 14:49:08
  • 491

C++利用常量表达式在编译期操作字符串

在打log的时候,往往有这样的需求,要把当前代码文件的文件名打印出来。 最简单的就是输出__FILE__宏。但是__FILE__实际上是包括文件名的完整路径,比如这样:/tmp/blablabla-...
  • qmickecs
  • qmickecs
  • 2017-09-29 09:23:00
  • 386

com.microsoft.sqlserver.jdbc.SQLServerException: CASE 说明中的任一结果表达式均不能是 NULL。

set XX=case xx when xx then null 这种
  • u014370239
  • u014370239
  • 2014-04-24 17:02:03
  • 840

表达式(四则运算)计算的算法

表达式(四则运算)计算的算法戏剧前奏——基本知识点通常我们所看到的算术表达式,运算符总是在两个操作数中间(除),如(A+B)*C,这样的表达式叫做中缀表达式。这种表达式不同的运算符优先级不同,而且通常...
  • luoweifu
  • luoweifu
  • 2013-08-29 00:24:39
  • 15494

什么是JVM、Java编译器和Java解释器

JVM:够运行Java字节码(Java bytecode)的虚拟机 Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种...
  • wangaiheng
  • wangaiheng
  • 2017-10-25 16:42:08
  • 507

JAVA 文件编译执行与虚拟机(JVM)简单介绍

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍...
  • yemou_blog
  • yemou_blog
  • 2015-12-14 11:12:59
  • 1836
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 1793
    排名: 2万+
    博客专栏
    最新评论