文档章节

编译器做的那些坏事

落叶伴长风
 落叶伴长风
发布于 2016/01/29 11:02
字数 425
阅读 9
收藏 0
点赞 1
评论 0

首先 我们要有一份可执行代码必须是这样子来

public static String getA(){return "a";}

public static void main(String[] args) {


	String  a = "a";
	final String c = "a";

	String b = a + "b"; 
	String d = c + "b"; 
	String e = getA() + "b";
	
	String compare = "ab";

	System.out.println(b == compare);
	System.out.println(d == compare);
	System.out.println(e == compare);		
	
}

结果显示是这样子的

false  
true
false

按照常理来讲 b d  e  都应该是"ab"啊, 统统应该相等

很可惜 == 在对象里面是比对象的地址,也就是引用的本身存储的值,诶这样也不对啊, b、d、e三个的地址不应该是一样的吗?

其实我个人也觉得一样,但是外国人非得优化, 代码分为两个阶段编译阶段和运行阶段

String b = a + "b";  这段代码外国人认为优化不了为啥, 因为 a可以变啊,
String d = c + "b";  这段代码外国人认为可以优化 因为c 被final 修饰了,所以d永远变不了 所以 d = "ab"了
String e = getA() + "b"; 那这个getA()呢,其实我觉得吧,非常量的一切东西都是可变的,与难以预测的,谁知道
getA里面是什么东西呢, 有又没有借助变量

 所以就在编译阶段做出了优化, 只有d 指向了常量区,b、e都新开了空间!


总结:编译器总是做一些优化,而我们则需要注意这些优化的细节!


© 著作权归作者所有

共有 人打赏支持
落叶伴长风
粉丝 0
博文 61
码字总数 7974
作品 0
南昌
程序员
在.NET平台上使用Scala语言(下):分析

上一篇文章里我们简单尝试了在Scala里编写.NET应用程序。这个过程并不困难,因为似乎Scala官方已经对此已经有较好的支持了。我们要做的只是“获取工具”,“编译成IL”,最后再“生成程序集”...

mj4738 ⋅ 2011/11/01 ⋅ 0

一些编程上的策略

这里将向大家分享的是一些我对编程的思考总结,这些经验在我毕生编程生涯中曾帮助我在无数的事情上作出正确的决定。这些编程策略有些是很显然的,但实际编程中往往被人们忽略。 下面的例子是...

oschina ⋅ 2013/07/02 ⋅ 12

为什么我不推荐 JavsScript 为首选编程语言

对于软件职业生涯,JavsScript不应该是首选 几天前,我写了一篇《what programming language you should learn first for a career in programming》的文章,引来了很多的争论(Google+ 上有...

腊八粥 ⋅ 2014/01/11 ⋅ 25

从 Larry Page 的语录一窥他经营 Google 的理念

Larry Page 是目前全世界最伟大的公司之一 Google 的掌门人。Google 创立后的很长一段时间里,Page 和公司的另一位联合创始人 Sergey Brin 共同管理着公司。2001 年,Eric Schmidt 开始接管公...

oschina ⋅ 2012/12/09 ⋅ 9

韭菜与买卖价差——EKOP模型初探

1 前言 最近异常忙碌,离上次写专栏已经过去数月。这几个月发生了许多事情,其中的一些对于我自己的人生来说,是不折不扣的黑天鹅。不过这些经历告诉我,生活与交易一样,起起落落,充满未知...

Clever Liu ⋅ 2017/06/15 ⋅ 0

.NET的完败与面向语义编程

微软的一切都是围着机器转的。除了那些买进来的东西,微软就没有生产过真正具有语义的东西,直到现在。直到WINDOWS PHONE。WP的实质其实只不过学苹果弄了个很炫的界面。不管它从商业上是不是...

刘小兵2014 ⋅ 2012/12/03 ⋅ 1

React Native Android Gradle 编译流程浅析(一)

我们先从 React Native 的 Android 编译来简单揭晓一下 React Native 在集成的过程中到底干了哪些不可告人的坏事;由于我们项目准备以 Gradle 形式接入,加上对 Gradle 比 BUCK 熟悉的多,所...

博为峰教研组 ⋅ 2016/11/18 ⋅ 1

后台检测U盘并复制到指定路径(C语言实现)

快期末考试了,老师的课件不让复制,于是乎写个小程序做点坏事,这是我(@tongtongxyz)写的半成品,,多多赐教。 /* Filename: udiskcopy.cpp * Function: 后台检测U盘并复制到指定路径 * Au...

TongtongXyz ⋅ 2013/01/12 ⋅ 2

D语言 2.069.2 Beta 发布,Bug 修复版本

D语言 2.069.2 Beta 发布,,此版本主要是 bug 修复,更新内容: DMD 编译器回退问题 Bugzilla 15292: [REG2.068.0] Segmentation fault with self-referencing struct / inout / alias thi......

oschina ⋅ 2015/11/30 ⋅ 5

如何使用gcc编译器?

目录: GCC rules 开始... 预编译 编译 汇编 连接 另外两个重要选项 调试 小结 站点链接 摘要: 要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。 首先,我们介绍如何...

xwisen ⋅ 2014/07/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 34分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 54分钟前 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部