<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-57  評論-129  文章-0  trackbacks-0
    最近看見一個(gè)JavaEye上關(guān)于Java基本類型編譯優(yōu)化的帖子。
    貌似高深莫測,其實(shí)疑點(diǎn)重重。吧內(nèi)容轉(zhuǎn)貼過來,希望在這里找到更合理的解釋。
    引用網(wǎng)上看得一些文章

     int a = 3;
     int b = 3;

      編譯器先處理int a = 3;首先它會(huì)在棧中創(chuàng)建一個(gè)變量為a的引用,然后查找有沒有字面值為3的地址,沒找到,就開辟一個(gè)存放3這個(gè)字面值的地址,然后將a指向3的地址。接著處 理int b = 3;在創(chuàng)建完b的引用變量后,由于在棧中已經(jīng)有3這個(gè)字面值,便將b直接指向3的地址。這樣,就出現(xiàn)了a與b同時(shí)均指向3的情況。

    再令a=4;那么,b不會(huì)等于4,還是等于3。在編譯器內(nèi)部,遇到a=4;時(shí),它就會(huì)重新搜索棧中是否有4的字面值,如果沒有,重新開辟地址存放4的值;如果已經(jīng)有了,則直接將a指向這個(gè)地址。因此a值的改變不會(huì)影響到b的值

    不知道真正的原理是不是那樣的?

    如果是的話能證明嗎?

    這些描述我也看過,很是不解。

    如果說這種基本類型也需要用這種指針的風(fēng)格,還要共享數(shù)據(jù),那么后續(xù)的操作處理起來不是更麻煩嗎?
    每次寫操作都要查找已有常量。甚至開辟新的空間存儲(chǔ)新值。
    再說這個(gè)指針怎么的也要個(gè)32位吧。為什么就不能直接吧值放進(jìn)去,硬是要通過指針跳來跳去的,有意義嗎?
    這優(yōu)化了嗎?

    反正在我看來,這是不可能的。

    希望有高手出來澄清一下,給個(gè)合理的解釋。

    如果是對的,那也應(yīng)該給出有點(diǎn)說服力的證據(jù)。
    如果是錯(cuò)的,那么建議大家吧這篇文章的源頭揪出來,這個(gè)確實(shí)誤人不淺。

    不過java對 String 這類不可變對象的處理,編譯器確實(shí)有類似優(yōu)化,不過也只是編譯期。
    這種系統(tǒng)類庫受到點(diǎn)編譯器的特別關(guān)注倒是很合理的。



    posted on 2007-07-30 08:29 金大為 閱讀(1169) 評論(12)  編輯  收藏 所屬分類: Java

    評論:
    # re: 一片可能是誤認(rèn)子弟的言論 2007-07-30 09:16 | Unmi
    我怎么沒見過說對
    int a=3;
    int b=b;
    編譯器會(huì)作如此的優(yōu)化呢?從兩次產(chǎn)生的字節(jié)碼是不會(huì)的

    int a=3;
    int b=3;

    String s1="hello";
    String s2="hello";

    產(chǎn)生的字節(jié)碼
    0: iconst_3 //整型常量值3壓棧
    1: istore_1 //從棧中彈出整型值,存到位置為1的局部變量中
    2: iconst_3 //整型常量值3壓棧
    3: istore_2 //從棧中彈出整型值,存到位置為2的局部變量中
    4: ldc #2; //String hello //2號(hào)位置的字符串常量壓棧
    6: astore_3 //從棧中彈出字符串值,存到位置為3的局部變量中
    7: ldc #2; //String hello //2號(hào)位置的字符串常量壓棧
    9: astore 4 //從棧中彈出字符串值,存到位置為4的局部變量中

    希望從上面的字節(jié)碼能讓你理解字符串常量
    我就是不知道你是在哪里看到那篇文章的。  回復(fù)  更多評論
      
    # re: 一片可能是誤認(rèn)子弟的言論 2007-07-30 09:31 | wangzx
    確實(shí)是被人誤了。對int這樣的JVM基本類型,根本不存在指針和共享的概念。  回復(fù)  更多評論
      
    # re: 一片可能是誤認(rèn)子弟的言論 2007-07-30 09:38 | 金大為
    我還是在4年前剛開始學(xué)Java時(shí)看到的,因?yàn)閷锩娴膬?nèi)容實(shí)在不敢茍同,感覺就像是那位吃飽了撐著沒事干的大牛吧人家愚人節(jié)的blog給翻譯過來了。印象比較深刻。但是,原文在那里,我已經(jīng)不記得了??傊且黄瑥V泛流傳的東西。

    這次我是在javaEye的帖子里看到的:http://www.javaeye.com/topic/102430  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 10:18 | Sun
    有些人學(xué)了一點(diǎn)東西就自認(rèn)高手
    什么都敢說
    一點(diǎn)不負(fù)責(zé)任  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 10:53 | dennis
    我真沒看過這篇文章,不知道在那里有出處,我倒想去看看,這個(gè)問題其實(shí)看過深入java虛擬機(jī)就沒什么疑問了。  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 11:06 | pass86
    學(xué)習(xí)。  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 11:06 | dennis
    可以肯定是基本類型是沒有什么內(nèi)存共享和指針的,效率考慮上也不需要。不同的地方在于基本類型變量定義在何處,在類的變量或者方法的局部變量是有一點(diǎn)小差異,類的實(shí)例變量和類變量在常量池中有入口,不過他們?nèi)肟诰褪撬麄兊闹?,而不是類似接口、類的符?hào)引用,同樣需要常量池解析這個(gè)步驟(直接解析)。而對于靜態(tài)的final變量都是在編譯時(shí)解析為常量值的本地拷貝。
    public class Test
    {
    int a=3;
    int b=3;
    static int c=3;
    public void test(){
    int a=3;
    int b=3;
    int c=this.c;
    }

    }

    javap -v Test  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論[未登錄] 2007-07-30 11:31 | dd
    的確是有一個(gè)常量池的
    public class dd
    {
    public static void main(String ... args)
    {
    Integer a=-1; //-1到127
    Integer b=-1;
    System.out.println(a==b);
    String str1="dd";
    String str2="dd";
    System.out.println(str1==str2);
    }
    }
    沒有new 出一個(gè)對象,值都是存進(jìn)常量池里的。


      回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 11:51 | dennis
    @dd
    你的理解錯(cuò)了,你的例子中main僅僅是一個(gè)方法,里面的變量都是局部變量,這些變量都以指令的形式寫在了字節(jié)碼中,當(dāng)調(diào)用方法是,這些變量也僅僅在java棧的局部變量區(qū)內(nèi),而不是常量池,方法調(diào)用也就是入棧出棧的操作。而常量池用于存儲(chǔ)類的名稱、方法和字段名稱以及串常量等信息,這是完全不同的。  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 14:09 | 金大為
    @dd
    我把你這段程序的字節(jié)碼貼出來

    // access flags 137
    public static transient varargs main([Ljava/lang/String;)V
    L0 (0)
    LINENUMBER 6 L0
    ICONST_M1
    INVOKESTATIC java/lang/Integer.valueOf(I)Ljava/lang/Integer;
    ASTORE 1
    L1 (4)
    LINENUMBER 7 L1
    ICONST_M1
    INVOKESTATIC java/lang/Integer.valueOf(I)Ljava/lang/Integer;
    ASTORE 2
    L2 (8)
    LINENUMBER 8 L2
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    ALOAD 2
    IF_ACMPNE L3
    ICONST_1
    GOTO L4
    L3 (15)
    ICONST_0
    L4 (17)
    INVOKEVIRTUAL java/io/PrintStream.println(Z)V
    L5 (19)
    LINENUMBER 10 L5
    LDC "dd"
    ASTORE 3
    L6 (22)
    LINENUMBER 11 L6
    LDC "dd"
    ASTORE 4
    L7 (25)
    LINENUMBER 12 L7
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 3
    ALOAD 4
    IF_ACMPNE L8
    ICONST_1
    GOTO L9
    L8 (32)
    ICONST_0
    L9 (34)
    INVOKEVIRTUAL java/io/PrintStream.println(Z)V
    L10 (36)
    LINENUMBER 13 L10
    RETURN
    L11 (38)
    LOCALVARIABLE args [Ljava/lang/String; L0 L11 0
    LOCALVARIABLE a Ljava/lang/Integer; L1 L11 1
    LOCALVARIABLE b Ljava/lang/Integer; L2 L11 2
    LOCALVARIABLE str1 Ljava/lang/String; L6 L11 3
    LOCALVARIABLE str2 Ljava/lang/String; L7 L11 4
    MAXSTACK = 3
    MAXLOCALS = 5  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-30 14:17 | 金大為
    對于Integer對象的直接原始類型(int)賦值,將編譯成Integer.valueOf(原始int值)。
    兩個(gè)Integer對象之所以地址相等,完全是Java5類庫層面的緩存所至。
    與上面討論的常量池?zé)o關(guān)。
    這個(gè)一看Integer.valueOf實(shí)現(xiàn)就明白了。  回復(fù)  更多評論
      
    # re: 一篇可能是誤認(rèn)子弟的言論 2007-07-31 14:51 | BruceLuo
    我想起來了,這是臺(tái)灣良格GE寫的吧,我沒有記錯(cuò)的話,他原來的是寫的是int a =100;int b =100吧。。。。希望大家?guī)兔φ蚁?  回復(fù)  更多評論
      
    主站蜘蛛池模板: 午夜免费福利片观看| 日韩精品视频免费观看| 亚洲AV无码一区二区三区在线| 99久久免费精品国产72精品九九| 日韩亚洲综合精品国产| 成人午夜亚洲精品无码网站| 成人免费视频网站www| 精品久久久久久亚洲综合网| 亚洲成人激情在线| 日韩精品视频免费观看| 男人j进入女人j内部免费网站 | 日韩中文字幕免费| 国色精品va在线观看免费视频| 国产成人精品亚洲2020| 亚洲色大成网站www永久一区| 特级做A爰片毛片免费69 | 美女内射无套日韩免费播放 | 免费网站看av片| 亚洲av无码专区在线观看下载| 亚洲AV美女一区二区三区| 国产免费怕怕免费视频观看| 精品国产sm捆绑最大网免费站 | 成年女人免费碰碰视频| 免费人成激情视频在线观看冫| 亚洲av纯肉无码精品动漫| 噜噜噜亚洲色成人网站∨| 亚洲国产成人久久综合碰| 日韩精品成人无码专区免费| 中文字幕无码免费久久9一区9| 亚洲成a∨人片在无码2023| 337p日本欧洲亚洲大胆精品555588| 亚洲中文字幕成人在线| 成人五级毛片免费播放| 亚洲免费网站在线观看| 成人性生交大片免费看好 | 永久黄网站色视频免费观看| 久久国产乱子伦免费精品| 免费无码又爽又刺激网站直播| 免费人妻精品一区二区三区| 亚洲爆乳精品无码一区二区| 亚洲乱码在线视频|