2013-11-15 28 views
3

在Java中,您聲明一個數組,然後調用new來分配空間。因此,隨着4個名爲整數類佔用較少的空間,並具有更好的地方比大小4不需要新對象的Java數組:分配連續性

數組有沒有辦法有4個元素的數組,但有它的分配方式相同命名vaiables a1, a2, a3, a4

對於那些瞭解C++,這是一樣的,要求int x[4]而不是int *x

class X 
{ 
    int x1; 
    int x2; 
    int x3; 
    int x4; 
}; 

[ Class OID ][x1][x2][x3][x4] = 1 ref + 4 int 

class Y 
{ 
    int y[]; 
}; 

y=new int[4]; 

[ Class OID ][Y] ======> [Array OID][Array Size][y][y][y][y] = 3 ref + size + 4 int 
+0

有4類命名整數與3個元素的數組具有相同的空間。第四個元素空間是數組大小(儘管有時這被吸收到頭中,而在其他情況下,它被分配舍入吞噬)。數組的分配基本上與帶有字段的對象的分配相同。 –

+0

@HotLicks - 我認爲它可能很昂貴 - 類中的指針(在64位系統上)大小爲2個整數 - 數組對象的運行時信息也是一個指針 - 另一個2 - 加上大小 - 另一個2 - 然後4個整數= 10個整數,而不是4個大小相同的大小加上可能導致緩存未命中的負載 –

+0

無論是在數組中還是在常規對象中,Java int都是4個字節。數組和常規對象都必須包含類指針。現在,如果你正在談論的是將一個對象(無論是數組還是常規對象)嵌入到另一個對象中,而不是使用指針(「引用」)來引用該對象,那麼這是無法完成的。如果你想這樣做使用C#(雖然我不確定C#可以真正做到而不是簡單地模擬它)。 –

回答

3

與Java 6起,在理想情況下,對象實際上是在棧上,而不是在堆上分配 - 換句話說,就是你要求的。通常,這是針對其引用不在創建範圍內的對象嘗試的。所以事實上,有時候「新」是完全免費的!雖然看起來Java代碼是冗長而低效的,但有幾層優化編譯器可以將您編寫的代碼轉化爲令人驚訝的高效機器代碼。

+0

堆棧上的分配可能是一個不錯的改進,但您仍然有兩個分配而不是1 –

0

你能做的唯一的事情就是這個

int x1, x2, x3, x4; 

void set(int i, int v) { 
    switch(i) { 
    case 0: 
     x1 = v; 
     break; 
    ... 
    default: 
     throw new IndexOutOfBoundsException(); 
    } 
} 

int get(int i) { 
... 

注意,在字節碼轉換進行了優化,它不檢查i順序而是直接進入所需的代碼

ILOAD 1 
TABLESWITCH 
    0: L1 
    1: L2 
    2: L3 
    3: L4 
    default: L5