2011-02-23 2 views
4

.NET에서는 int와 같은 값 형식 개체가 메모리에 저장됩니다.
.NET 개체 힙에 저장된 값 형식의 배열은 어떻습니까?

참조 유형 개체는 참조 및 개체에 별도의 메모리 할당이 필요하며 개체는 .NET 개체 힙에 저장됩니다.

배열이 힙에서 만들어 지므로 힙에 int []와 같은 값 유형의 배열이 저장되는 이유는 무엇입니까? 그것은 값 유형 개체가 힙에 권투없이 저장할 수 있다는 것을 의미합니까?

+0

나는 모든 것이 "메모리"에 저장된다고 말할 것입니다. (글쎄요 ... 실제로 저장되지 않은 상수와 쓸모 없거나 상수로 최적화 된 변수 제외). "유형"의 메모리 (레지스터/RAM/디스크, 직접 액세스 가능한 메모리에 대해서만 말하고 캐시를 건너 뛰기) 또는 조직 (스택, 힙, ???)에 대해서만 말할 수 있습니다 :-) 아마 당신은 "스택 메모리"라고했지만, 당신이 발견 한 것처럼 잘못된 것입니다. – xanatos

+0

'int와 같은 값 형식 개체가 메모리에 저장되었습니다.'라는 메시지가 나에게 약간의 오해를 불러 일으킬 수 있습니다. 힙은 물론 메모리 일뿐입니다. – user492238

답변

6

예, 당신이 옳다. 나는 당신이이 글을 읽을 제안 :

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

아주 아주 좋은, 그리고 당신이 알고 이제까지을 할 것입니다 거의 모든 것을 설명합니다.

+0

그렇다면 거의 모든 시간에 모든 값 유형이 HEAP에만 저장됩니다. 즉, 모든 인스턴스 변수가 힙에있을 것입니다.이 올바른 이해입니까? – dsi

4

예 배열은 값 유형 값이 복싱없이 힙에 저장 될 수있는 방법입니다. 또 다른 그냥 일반 클래스에서이를 데 : Foo의 인스턴스와 관련된

public class Foo 
{ 
    int value1; 
    string name; 
    // etc 
} 

모든 변수는 힙에 저장됩니다. value1의 값은 의 값이 문자열 참조 인 반면에 불과합니다.

이 때문에 "값 유형이 스택에 저장되고 참조 유형이 힙에 저장됩니다"라는 주장은 분명히 잘못되었습니다.

그러나 Eric Lippert는 rightly fond of pointing out이므로 스택/힙 구분은 구현 세부 사항입니다. 예를 들어, CLR 의 차기 버전에서는 메서드가 종료 된 후에도 필요하지 않다면 작동 할 수있는 경우 개체가 스택에 저장 될 수 있습니다.

0

그렇습니다. 전체 배열 은 전체적으로이 Array 객체 내에서 "박스형"이기 때문에 reach 요소에 대해 boxing이 수행되지 않았 음을 의미합니다.

값 유형이 힙에 배치되기 전에 박스 처리되어야한다는 요구 사항은 없습니다. 다음과 같은 세 가지 방법으로 힙에 값 유형을 배치 할 수 있습니다.

  1. 일반 오브젝트 내부에 값 유형을 배치합니다.

  2. 복싱으로.

  3. 배열 객체 안에 배치합니다.

은 ( 더 많은 방법이있을 수 있습니다하지만 난 하나를 놓친 생각하지 않습니다.)

0

이렇게 생각하면 메모리의 개체 위치는 어떤 종류의 형식인지 선언 된 위치에 의해 정의됩니다. 객체가 값 유형 인 경우 변수를 선언 한 곳의 이 저장됩니다. 객체가 참조 유형 인 경우 참조은 실제 객체 인스턴스가 힙에있는 동안 변수를 선언 한 위치에 저장됩니다.

로컬 변수를 선언하면 스택에 변수가 선언됩니다. 따라서 값 유형의 값은 스택에 있습니다. 참조 유형의 참조는 스택에 있고 객체 인스턴스는 여전히 힙에 있습니다.

클래스 (참조 유형)에서 인스턴스 변수를 선언하면 효과적으로 힙에 인스턴스 변수가 선언됩니다. 값 유형의 값은 힙 (오브젝트 인스턴스에서)에 있습니다. 참조 유형의 참조는 힙 (오브젝트 인스턴스에서)에도 있으며, 오브젝트 인스턴스는 힙의 다른 위치에 있습니다.

구조체 (값 형식)에서 인스턴스 변수를 선언하면 해당 구조체가있는 곳은 기본 구조체가 선언 된 위치에 따라 달라집니다.

배열의 경우 int[], 배열은 참조 형식이므로 배열 형식이 "필드"로 선언 된 int 값을 해당 형식으로 생각하면 정수가 효율적으로 힙에있게됩니다.

관련 문제