自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

(a+b)*10,10是存在哪里的?是常量池么?

開發(fā) 后端
今天看到一個很有意思的提問:(a+b)*10,10是存放在哪里的?是常量池么?如果是常量池,在進(jìn)行運算的時候,是通過指針來找到的吧?

[[387051]]

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

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

要驗證這個答案是否正確其實很簡單,寫一個測試方法通過javap查看編譯后的字節(jié)碼指令就能得出結(jié)論。

測試方法源碼如下:

  1. private int m(int a, int b) { 
  2.     int r = a * b * 10; 
  3.     return r; 

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

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

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

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

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

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

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

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

 

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

本文轉(zhuǎn)載自微信公眾號「Java藝術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java藝術(shù)公眾號。

 

責(zé)任編輯:武曉燕 來源: Java藝術(shù)
相關(guān)推薦

2021-10-20 09:20:40

手機定位互聯(lián)網(wǎng)位置服務(wù)

2021-10-28 22:31:11

存儲云存儲數(shù)據(jù)

2014-01-07 13:54:40

Hadoop日志

2015-10-08 10:24:40

藍(lán)屏Windows 10微軟

2024-07-30 14:18:12

2024-06-20 13:48:18

2022-05-25 16:58:10

邊緣計算

2015-11-09 17:22:02

2021-12-17 17:50:50

RTORPO場景

2015-07-30 11:40:51

中國網(wǎng)

2023-12-27 18:50:26

2021-04-14 10:58:54

OWASP Top 1web安全身份驗證

2021-06-01 10:49:22

線程池Java開發(fā)

2021-06-03 14:23:57

線程線程池JAVA

2016-08-02 14:53:18

Windows10藍(lán)屏死機

2017-01-12 21:02:29

Windows 10系統(tǒng)更新

2020-06-18 12:32:12

微軟開發(fā)者Windows 10

2021-02-18 16:19:58

比特幣加密資產(chǎn)貨幣

2021-02-15 15:36:04

采礦加密貨幣區(qū)塊鏈

2018-10-26 15:54:16

JavaClass常量池
點贊
收藏

51CTO技術(shù)棧公眾號