簡體   English   中英

JVM指令-加載

[英]JVM instructions - sload

我想這是一個基本問題,但是為什么沒有sload指令? 為什么您可以加載除short之外的所有基元? (有saload ,但仍然...)

對於:

public class ShortTest {
    public void test() {
        short i = 1;
        System.out.print(i);
    }
}

編譯器仍使用iload_1 是因為16位類型短而處理器能處理更好的32位(因為所有現代處理器都是32/64位)?

請參閱JVM規范§2.11.1。 類型和Java虛擬機

請注意, 表2.11.1-A中的大多數指令都沒有整數類型bytecharshort 沒有一個具有boolean類型的形式。 編譯器使用Java虛擬機指令對byteshort類型的文字值的負載進行編碼,這些指令在編譯時或運行時將這些值符號擴展為int類型的值。 使用booleanchar類型的文字值的加載使用指令進行編碼,這些指令在編譯時或運行時將文字零擴展為int類型的值。 同樣,使用Java虛擬機指令對booleanbyteshortchar類型的值數組中的負載進行編碼,這些指令將這些值進行符號擴展或零擴展為int類型的值。 因此,對實際類型為booleanbytecharshort值的大多數操作都由對計算類型為int值的指令正確執行。

值得回顧的是,在Java中,任何不涉及long整數運算都將具有int結果,而不管輸入是bytecharshort還是int

所以像

short i = 1, j = 2, k = i + j;

不會編譯,但需要類型轉換,例如

short i = 1, j = 2, k = (short)(i + j);

而這種類型轉換將是唯一涉及short指標。 放開調試提示,字節碼中沒有正式的局部變量聲明,只有確定其類型的值賦值。 因此, short類型的局部變量根本不存在。 上面的代碼編譯為

     0: iconst_1
     1: istore_1
     2: iconst_2
     3: istore_2
     4: iload_1
     5: iload_2
     6: iadd
     7: i2s
     8: istore_3

這與的編譯形式相同

int i = 1, j = 2, k = (short)(i + j);

但是請注意,在重載的情況下,變量的編譯時類型可以更改編譯器為調用選擇的方法。 如果類型具有不同的語義,這尤其重要,例如print(boolean)print(char) 盡管傳遞給方法的值在兩種情況下均為int類型,但結果卻完全不同。

編譯器強制執行的差異的另一個示例是

{
    int i = 1;
    i++;
}
{
    short s = 1;
    s++;
}

被編譯為

     0: iconst_1
     1: istore_1
     2: iinc          1, 1
     5: iconst_1
     6: istore_1
     7: iload_1
     8: iconst_1
     9: iadd
    10: i2s
    11: istore_1

因此,由於計算總是以32位執行,因此編譯器會插入必要的代碼以將結果截斷為第二個增量的short 再次注意,沒有變量聲明,因此代碼與的編譯形式相同

int i = 1;
i++;
i = 1;
i = (short)(i+1);

值得一看的是Verification Type System ,因為驗證者將檢查從本地變量到本地變量的所有傳輸的有效性:

類型檢查器根據驗證類型的層次結構實施類型系統,如下所示。

 Verification type hierarchy: top ____________/\\____________ / \\ / \\ oneWord twoWord / | \\ / \\ / | \\ / \\ int float reference long double / \\ / \\_____________ / \\ / \\ uninitialized +------------------+ / \\ | Java reference | / \\ | type hierarchy | uninitializedThis uninitialized(Offset) +------------------+ | | null 

因此,與Java語言類型相比,類型系統得到了簡化,並且驗證程序不介意,例如,如果您將boolean值傳遞給需要char的方法,因為它們都是int類型。

因為所有局部變量都至少占用一個32位插槽。 字節也一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM