簡體   English   中英

Java如何識別位置是否包含基元或引用

[英]How does Java identify if a location holds primitive or reference

如果堆上有一個對象,並且該對象有一些實例變量,則一些是基本類型,很少是其他對象。 那么,如果這個對象有5個字段,那么對象在內存中的結構如何呢? 具體而言...... Java在哪里存儲每個字段的數據類型? 是否有一些'標志字節'和一些'數據字節',其中'標志字節'標識下幾個'數據字節'的數據類型?

我指的是除了這個答案之外的一些其他細節: https//stackoverflow.com/a/19623603/1364747

這個答案會詳細介紹數據本身如何存儲在內存中: https//stackoverflow.com/a/1907455/1364747

但它仍然沒有說明存儲標志的位置,該標志表示數據類型為int / long / double / float / reference。

這是一個更具體的答案,我恐怕仍然無法回答你的所有問題。 以下是java 7文檔的鏈接,相關部分為“2.11。指令集摘要”: https//docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

我會復制並粘貼一些:

2.11.1。 類型和Java虛擬機

Java虛擬機指令集中的大多數指令都會編碼有關它們執行的操作的類型信息。 例如,iload指令(§iload)將局部變量的內容加載到操作數堆棧上,該變量必須是int。 fload指令(§fload)對浮點值執行相同操作。 這兩條指令可能具有相同的實現,但具有不同的操作碼。

對於大多數類型化指令,指令類型在操作碼助記符中由字母明確表示:i表示int操作,l表示long,s表示short,b表示字節,c表示char,f表示float,d表示double ,以供參考。

2.11.2。 加載和存儲指令

加載和存儲指令在Java虛擬機幀(第2.6節)的局部變量(第2.6.1節)和操作數堆棧(第2.6.2節)之間傳輸值。

訪問對象字段和數組元素(第2.15.5節)的指令也會將數據傳入和傳出操作數堆棧。

那里還有更多。 有趣的閱​​讀。

僅在編譯時需要類型信息以生成正確的字節碼。 字節碼指令(如匯編指令)通常只能作用於一種數據類型。 因此,使用的指令反映了操作數的類型。 大多數C系列語言都是如此。

為了了解在使用基元和動態分配時字節碼如何不同,我們舉一個簡單的例子。

public static void main (String [] args) {
    int i = 0;
    int j = i + 1;
}

並生成字節碼:

public static void main(java.lang.String[]);
  Code:
     0: iconst_0
     1: istore_1
     2: iload_1
     3: iconst_1
     4: iadd
     5: istore_2
     6: return

因此,我們存儲和加載使用整數istoreiload ,然后我們使用它們添加iaddi為整數)。

現在以這個例子為例,使用動態內存分配而不是原語:

public static void main (String [] args) {
    Integer i = new Integer(0);
    int j = i + 1;
}

和字節碼:

public static void main(java.lang.String[]);
  Code:
     0: new           #2                  // class java/lang/Integer
     3: dup
     4: iconst_0
     5: invokespecial #3                  // Method java/lang/Integer."<init>":(I)V
     8: astore_1
     9: aload_1
    10: invokevirtual #4                  // Method java/lang/Integer.intValue:()I
    13: iconst_1
    14: iadd
    15: istore_2
    16: return

在這個版本中,我們首先必須調用Integer對象的intValue()方法來檢索值,然后我們可以通過iadd對它進行iadd

並且有證據表明在編譯之后不需要存儲數據類型(因為它們在指令本身中編碼,如“整數存儲”的istore ),請參閱jrahhali的答案中的參考。

暫無
暫無

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

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