第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 字節(jié)碼中的 Stack=4。Java 編譯器如何計算 4 的值?

Java 字節(jié)碼中的 Stack=4。Java 編譯器如何計算 4 的值?

慕斯709654 2022-05-21 20:43:18
Java 代碼:public class SimpleRecursion {    public int factorial(int n) {        if (n == 0) {            return 1;        }        return n * factorial(n - 1);    }}為階乘方法提供以下字節(jié)碼(我執(zhí)行 javap 來生成它):public int factorial(int); descriptor: (I)I flags: ACC_PUBLIC Code:     stack=4, locals=2, args_size=2     0: iload_1     1: ifne          6     4: iconst_1     5: ireturn     6: iload_1     7: aload_0     8: iload_1     9: iconst_1    10: isub    11: invokevirtual #2                  // Method factorial:(I)I    14: imul    15: ireturn     LineNumberTable:    line 4: 0    line 5: 4    line 7: 6     StackMapTable: number_of_entries = 1    frame_type = 6 /* same */我知道在上面塊的第五行中,stack=4 意味著堆棧最多可以有 4 個 objects。但是編譯器是如何計算的呢?
查看完整描述

1 回答

?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊

由于棧的初始狀態(tài),以及每條指令對它的影響是眾所周知的,你可以精確地預(yù)測,在任何時候,操作數(shù)棧上會出現(xiàn)什么樣的項:


[ ]            // initially empty

[ I ]          0: iload_1

[ ]            1: ifne          6

[ I ]          4: iconst_1

[ ]            5: ireturn

[ I ]          6: iload_1

[ I O ]        7: aload_0

[ I O I ]      8: iload_1

[ I O I I ]    9: iconst_1

[ I O I ]     10: isub

[ I I ]       11: invokevirtual #2   // Method factorial:(I)I

[ I ]         14: imul

[ ]           15: ireturn   

JVM 的驗證器會這樣做,在每條指令之后預(yù)測堆棧的內(nèi)容,以檢查它是否適合作為后續(xù)指令的輸入。但它在這里有幫助,有一個聲明的最大大小,所以驗證器不需要維護(hù)一個動態(tài)增長的數(shù)據(jù)結(jié)構(gòu)或為理論上可能的 64k 堆棧條目預(yù)分配內(nèi)存。使用聲明的最大大小,它可以在遇到會推送更多的指令時停止,因此它永遠(yuǎn)不需要比聲明更多的內(nèi)存。


如您所見,聲明的最大堆棧大小恰好iconst_1在索引 9 處的指令之后達(dá)到一次。


然而,這并不意味著編譯器必須執(zhí)行這樣的指令分析。編譯器具有從源代碼派生的代碼的更高級別模型,稱為抽象語法樹。


該結(jié)構(gòu)將用于生成生成的字節(jié)碼,并且它還可能已經(jīng)能夠預(yù)測該級別所需的堆棧大小。但是編譯器實際上是如何做到的,是依賴于實現(xiàn)的。


查看完整回答
反對 回復(fù) 2022-05-21
  • 1 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號