溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jdk1.8中(a+b)*10的10是存在哪里的

發(fā)布時(shí)間:2021-10-18 09:37:20 來(lái)源:億速云 閱讀:126 作者:柒染 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)jdk1.8中(a+b)*10的10是存在哪里的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

今天看到一個(gè)很有意思的提問(wèn):(a+b)*10,10是存放在哪里的?是常量池么?如果是常量池,在進(jìn)行運(yùn)算的時(shí)候,是通過(guò)指針來(lái)找到的吧?

某回答:10是在常量池,常量池在jdk1.8以后已經(jīng)移到元空間了。

要驗(yàn)證這個(gè)答案是否正確其實(shí)很簡(jiǎn)單,寫(xiě)一個(gè)測(cè)試方法通過(guò)javap查看編譯后的字節(jié)碼指令就能得出結(jié)論。

測(cè)試方法源碼如下:

private int m(int a, int b) {     int r = a * b * 10;     return r; }

使用javap查看編譯后的字節(jié)碼如下:

private int m(int, int);   descriptor: (II)I   flags: ACC_PRIVATE   Code:     stack=2, locals=4, args_size=3          0: iload_1          1: iload_2          2: imul          3: bipush        10          5: imul          6: istore_3          7: iload_3          8: ireturn

筆者翻閱了一下JVM字節(jié)碼指令表,相關(guān)指令如下圖所示。

jdk1.8中(a+b)*10的10是存在哪里的

字節(jié)碼指令由操作碼和零個(gè)或多個(gè)操作數(shù)組成,編譯后會(huì)被寫(xiě)入方法的Code屬性中,操作數(shù)要么是立即數(shù),要么是指向class文件結(jié)構(gòu)常量池中常量的索引,要么是跳轉(zhuǎn)目標(biāo)指令的偏移量。

設(shè)立即數(shù)10為x,可得出以下結(jié)論:

當(dāng)x取值在區(qū)間[-1,5]時(shí),x直接被編譯進(jìn)方法的code屬性中,作為iconst指令的操作數(shù);

當(dāng)x取值在區(qū)間[-128,127]時(shí),x也直接被編譯進(jìn)方法的code屬性中,作為bipush指令的操作數(shù),取值范圍[-128,127]是因?yàn)閎ipush指令的操作數(shù)只能是一個(gè)字節(jié);

當(dāng)x取值在區(qū)間[-32768,32767]時(shí),x也直接被編譯進(jìn)方法的code屬性中,作為sipush指令的操作數(shù),取值范圍[-32768,32767]是因?yàn)閟ipush指令的操作數(shù)有兩個(gè)字節(jié);

否則才會(huì)將x編譯進(jìn)class的常量池,在進(jìn)行運(yùn)算時(shí)通過(guò)ldc指令從常量池(元空間)push進(jìn)操作數(shù)棧中。

看完上述內(nèi)容,你們對(duì)jdk1.8中(a+b)*10的10是存在哪里的有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI