배열은 힙에 할당되며 int는 상자로 표시되지 않습니다.
사람들이 참조 유형이 힙에 할당되고 값 유형이 스택에 할당되었다고 말했기 때문에 혼란의 원인이 될 수 있습니다. 이것은 완전히 정확한 표현이 아닙니다.
모든 지역 변수 및 매개 변수는 스택에 할당됩니다. 여기에는 값 형식과 참조 형식이 모두 포함됩니다. 이 둘의 차이점 은 변수에 저장된 것입니다 . 놀랍게도, 값 유형 의 경우 유형 값 이 변수에 직접 저장되고 참조 유형의 경우 유형 값이 힙에 저장되며이 값에 대한 참조 는 변수에 저장됩니다.
필드도 마찬가지입니다. 집계 유형 (a class
또는 a struct
) 의 인스턴스에 메모리가 할당되면 각 인스턴스 필드에 대한 스토리지를 포함해야합니다. 참조 유형 필드의 경우이 스토리지는 값에 대한 참조 만 보유하며 나중에 힙에 할당됩니다. 값 유형 필드의 경우이 스토리지는 실제 값을 보유합니다.
따라서 다음 유형이 주어집니다.
class RefType{
public int I;
public string S;
public long L;
}
struct ValType{
public int I;
public string S;
public long L;
}
이러한 각 유형의 값에는 16 바이트의 메모리가 필요합니다 (32 비트 워드 크기로 가정). 필드 I
각각의 경우에 그 값을 저장하기 위해 4 바이트를 얻어,이 필드는 S
그 기준을 저장하는 4 바이트를 취하고,이 필드는 L
그 값을 저장하기 위해 8 바이트 걸린다. 모두의 값에 대한 메모리 그래서 RefType
및 ValType
다음과 같다 :
0 ┌────────────────────┐
│ 나 │
4 ├────────────────────┤
│ S │
8 ├────────────────────┤
│ L │
│ │
16 └────────────────────┘
지금 당신은 유형의 함수에 세 개의 지역 변수가 있다면 RefType
, ValType
그리고 int[]
다음과 같이 :
RefType refType;
ValType valType;
int[] intArray;
그러면 스택은 다음과 같습니다.
0 ┌────────────────────┐
│ RefType │
4 ├────────────────────┤
│ valType │
│ │
│ │
│ │
20 ├────────────────────┤
│ intArray │
24 └────────────────────┘
다음과 같이 이러한 로컬 변수에 값을 할당 한 경우 :
refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;
valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;
intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;
그런 다음 스택이 다음과 같이 보일 수 있습니다.
0 ┌────────────────────┐
│ 0x4A963B68 │-`refType`의 힙 주소
4 ├────────────────────┤
│ 200 │-valval.I의 값
│ 0x4A984C10 │-`valType.S`의 힙 주소
│ 0x44556677 │-32 비트의 낮은 valval.L
│ 0x00112233 │-높은 32 비트`valType.L`
20 ├────────────────────┤
│ 0x4AA4C288 │-`intArray`의 힙 주소
24 └────────────────────┘
주소의 메모리 0x4A963B68
(의 값 refType
)는 다음과 같습니다.
0 ┌────────────────────┐
│ 100 │-`refType.I '의 값
4 ├────────────────────┤
│ 0x4A984D88 │-`refType.S`의 힙 주소
8 ├────────────────────┤
│ 0x89ABCDEF │-32 비트의 낮은 RefType.L
│ 0x01234567 │-높은 32 비트`refType.L`
16 └────────────────────┘
주소의 메모리 0x4AA4C288
(의 값 intArray
)는 다음과 같습니다.
0 ┌────────────────────┐
│ 4 │-배열의 길이
4 ├────────────────────┤
│ 300 │-`intArray [0]`
8 ├────────────────────┤
│ 301 │-`intArray [1]`
12 ├────────────────────┤
│ 302 │-`intArray [2]`
16 ├────────────────────┤
│ 303 │-`intArray [3]`
20 └────────────────────┘
이제 intArray
다른 함수에 전달 하면 스택에 푸시 된 값 0x4AA4C288
은 배열 의 복사본이 아닌 배열의 주소입니다 .