2014-09-24 87 views
0

假設我們有下面的代碼:數組局部變量的哪部分存儲在堆棧上?哪一部分在堆上?

void method() { 
    int[] test = new int[3]; 
    test[0] = 0; 
    test[1] = 1; 
    test[2] = 2; 
} 

從我從Jon Skeet's post on SO讀取時,new int[3]部分相當於:

public class ArrayInt3 { 
    public readonly int length = 3; 
    public int value0; 
    public int value1; 
    public int value2; 
} 

這是否意味着test(以ArrayInt3參考)是堆棧?這是否意味着ArrayInt3在堆上?我想value0,value1value2也在堆上(即在這個例子中是0,1,2)?

所以總共有4個對象在堆上,對嗎?

回答

1

堆棧上沒有對象。在堆棧中,存儲在堆中的單個對象int[]會有參考值。

您必須開始區分對象,變量和值。

局部變量是堆棧中方法堆棧幀的一部分。因此,對int[]的參考值將被存儲在堆棧上的變量中。

+0

@SomeRandomGuy這些都不是對象。首先,'ArrayInt3'是一種類型。其餘的是價值觀。它們是單個'int []'對象的一部分。他們不是獨立的。 – 2014-09-24 15:55:07

+0

@SomeRandomGuy如果它們被初始化,它們將是4個參考值,指向堆上的其他4個對象。 – 2014-09-24 15:55:48

+0

@SomeRandomGuy不,堆上有一個對象,即int []對象。 – 2014-09-24 15:56:14