诗剑书生的专栏

我在灌江口上住,花开花落,不知流年度.雁过空遗秋色暮,抚琴细听梧桐雨. 轻舞残虹漫展书,云卷云舒,思愫万千缕.安得婵娟与共处,长作识字耕田夫.                   诗剑书生 于灌江口.听潮居

诗剑书生ID:axman
101555次访问,排名831好友1人,关注者6
一个男人. 一个写程序男人. 一个写程序并从程序中寻找快乐的男人. 一个写程序并从程序中寻找快乐又把快乐传递给大家的男人.
一个书生. 一个寂寞的书生. 一个寂寞的梅香竹影下敲声写韵的书生. 一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生.
那个男人是位书生。没有人知道他的姓名,居无定所,行无定踪,亦耕亦读,或渔或樵。
[加为好友] [即时聊天] [发私信]
axman的文章
原创 87 篇
翻译 0 篇
转载 0 篇
评论 157 篇
axman的公告
最近评论
guiji01:s+1中,+操作有两个操作数,JVM指令中+操作最小类型是int,byte,short,char都以iload,iadd来操作

老大你要注意标点符号。。。。,byte、short、char之间用顿号吧。不过我试了一下,顿号不好打出来,也怪我看的不认真,费了挺长时间。。。
guiji01:哈哈,大概半年前看java的一系列的基础概念时,百思不得其解时,看到了您的文章,确实写的很好,很好。

虽然现在有些地方仍然一知半解,最近找工作,这两天准备再次拜读。

ps:n久不来csdn了,专门登陆致谢!真的很希望能认识您。dodoryan#gmail.com
axman:GPRS模块拨号上去以后可以浏览网页,说明你用cmnet拔上去的,而MMS应该用cmwap拔号.
weiquanqiang:请问楼主我用GPRS模块拨号上去以后可以浏览网页,但我在用程序发送彩信时候总是提示“无法连接到到远程服务器”,这是什么原因呀????
chinagavin:你为什么不写书呢??
写什么书我都支持,一定买。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 为什么对象被new 以后在执行dup操作?收藏

    新一篇: 关于央视国际(CCTV.COM)的奥运门户网站的预警 | 旧一篇: HTTPS传送文件的打包方式(为一个朋友调试的过程)

    为什么对象被new 以后在执行dup操作?
    今天有个朋友问我,为什么一个new一个对象的指令在new后面紧跟的是dup操作?他说搜了可能找到的
    搜索引擎都找不到答案,包括翻了<<深入JAVA虚拟机指令>>这本书也没有任何说明.

    我们先来看看为dup指令的作用,dup指令可以复制栈顶的一个字再压入栈,也就是把栈顶的内容做个备份.
    大家知道,JAVA/CLR是完全基于栈的实现,任何操作都是入栈出栈,没有任何寄存器,所以如果要对某一操作
    数做两次连续操作,那就要复制两次栈顶操作数,比如:
    int x;
    int y = x = 2;
    当常数2被压入栈顶后,它要连续两次store到变量x和y,所以这里编译后肯定有一个dup操作:

     bipush  20
     dup
     istore_1
     istore_2
    如果不做dup操作,那么istore_1将20存到内存中的x后,再istore_2要么没有操作数,要么是一个其它的操作数.
    当然这在编译时对连续操作已经做dup操作了,所以不会真的出现这个情况.
    那么new 指令后,为什么一定要dup操作呢?
    因为java代码的new操作编译为虚拟机指令后,虚拟机指令new在堆上分配了内存并在栈顶压入了指向这段内存的
    地址供任何下面的操作来调用,但是在这个操作数被程序员能访问的操作之前,虚拟机自己肯定要调用对象的
    <init>方法,也就是如果程序员做一个 Type a = new Type();其实要连续两次对栈顶的操作数进行操作.其中一
    次是虚拟机内部自动调用的,这种情况是99%以上存在的,而java 编译器是一种聪明的编译器,所以只要有new操作
    就优化为将对象的地址操作数DUP,第一次调用invokespecial <init>时会毕弹出一个,下面一个留给对该对象访问
    的操作,即使你的代码是:new Type();没有任何引用.虚拟机也会先dup,然后<init>时弹出一个操作数,后面会立即
    pop掉被复制的那个操作数.这样的做目的是为了编译优化.

    有人说那可以直接从栈顶先store到内存中,需要操作的时候再load到栈顶啊,注意再没有<init>操作这前对象对于

    程序员是不可见的,否则就会访问到残废的对象,所以只能是先<init>然后才能store到内存中.这两步操作的操作数必须都直接是原来已经存在栈中的,所以只能是dup.

    发表于 @ 2008年05月05日 14:59:00|评论(loading...)|编辑

    新一篇: 关于央视国际(CCTV.COM)的奥运门户网站的预警 | 旧一篇: HTTPS传送文件的打包方式(为一个朋友调试的过程)

    评论

    #chinagavin 发表于2008-07-03 09:34:10  IP: 210.51.173.*
    你为什么不写书呢??
    写什么书我都支持,一定买。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © axman