>백엔드 개발 >C++ >힙 대 스택 할당: 배열과 값 유형은 메모리의 어디에 있습니까?

힙 대 스택 할당: 배열과 값 유형은 메모리의 어디에 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-02 17:53:44649검색

Heap vs. Stack Allocation: Where Do Arrays and Value Types Live in Memory?

힙 및 스택 할당: 배열 및 값 유형 분석

제시된 코드 조각에서:

int[] myIntegers;
myIntegers = new int[100];

myIntegers 배열이 생성됩니다. . 일반적인 믿음과는 달리, 배열 내에 저장된 실제 정수 값은 박싱 처리되지 않습니다.

스택 및 힙 할당 명확화

값 유형이 배열에 할당된다는 일반적인 오해 힙의 스택 및 참조 유형이 완전히 정확하지는 않습니다. 유형에 관계없이 모든 지역 변수와 매개변수는 스택에 할당됩니다. 주요 차이점은 다음 변수에 저장되는 내용에 있습니다.

  • 값 유형: 실제 값은 변수에 직접 저장됩니다.
  • 참조 유형: 힙에 저장된 값에 대한 참조는 변수.

값 및 참조 유형에 대한 메모리 할당

값 및 참조 유형 모두 특정 양의 메모리를 차지하며, 제공된 예제 유형의 경우 일반적으로 16바이트입니다. . 이 메모리 내:

  • 값 유형의 경우 모든 필드는 해당 값을 직접 저장합니다.
  • 참조 유형의 경우 참조 유형 필드는 힙에 있는 값에 대한 참조를 저장하고, 값은 힙에 있는 값에 대한 참조를 저장합니다. 유형 필드는 실제 값을 저장합니다.

예: 스택 및 힙 할당

다음 지역 변수를 고려하세요.

RefType refType;
ValType valType;
int[] intArray;

처음에는 해당 참조만 스택에 상주하며 20바이트를 차지합니다.

 0 ┌───────────────────┐
   │     refType       │
 4 ├───────────────────┤
   │     valType       │
   │                   │
   │                   │
   │                   │
20 ├───────────────────┤
   │     intArray      │
24 └───────────────────┘

할당 시 값을 다음 변수에 추가합니다.

// Assign values to refType
// ...
// Assign values to valType
// ...
intArray = new int[4];
intArray[0] = 300;
// ...
intArray[3] = 303;

스택 표현은 유사:

 0 ┌───────────────────┐
   │    0x4A963B68     │ -- heap address of `refType`
 4 ├───────────────────┤
   │       200         │ -- value of `valType.I`
   │    0x4A984C10     │ -- heap address of `valType.S`
   │    0x44556677     │ -- low 32-bits of `valType.L`
   │    0x00112233     │ -- high 32-bits of `valType.L`
20 ├───────────────────┤
   │    0x4AA4C288     │ -- heap address of `intArray`
24 └───────────────────┘

배열과 값 및 참조 유형은 모두 앞에서 설명한 대로 메모리 레이아웃을 사용하여 힙의 특정 섹션을 차지합니다.

요약하면 배열 myIntegers은 힙에 할당되지만 그 안에 저장된 개별 정수 값은 박스로 표시되지 않습니다. 추가 객체로 래핑할 필요 없이 힙의 할당된 메모리 내에 직접 저장됩니다.

위 내용은 힙 대 스택 할당: 배열과 값 유형은 메모리의 어디에 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.