.NET에서는 int와 같은 값 형식 개체가 메모리에 저장됩니다.
.NET 개체 힙에 저장된 값 형식의 배열은 어떻습니까?
참조 유형 개체는 참조 및 개체에 별도의 메모리 할당이 필요하며 개체는 .NET 개체 힙에 저장됩니다.
배열이 힙에서 만들어 지므로 힙에 int []와 같은 값 유형의 배열이 저장되는 이유는 무엇입니까? 그것은 값 유형 개체가 힙에 권투없이 저장할 수 있다는 것을 의미합니까?
.NET에서는 int와 같은 값 형식 개체가 메모리에 저장됩니다.
.NET 개체 힙에 저장된 값 형식의 배열은 어떻습니까?
참조 유형 개체는 참조 및 개체에 별도의 메모리 할당이 필요하며 개체는 .NET 개체 힙에 저장됩니다.
배열이 힙에서 만들어 지므로 힙에 int []와 같은 값 유형의 배열이 저장되는 이유는 무엇입니까? 그것은 값 유형 개체가 힙에 권투없이 저장할 수 있다는 것을 의미합니까?
예, 당신이 옳다. 나는 당신이이 글을 읽을 제안 :
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
아주 아주 좋은, 그리고 당신이 알고 이제까지을 할 것입니다 거의 모든 것을 설명합니다.
그렇다면 거의 모든 시간에 모든 값 유형이 HEAP에만 저장됩니다. 즉, 모든 인스턴스 변수가 힙에있을 것입니다.이 올바른 이해입니까? – dsi
예 배열은 값 유형 값이 복싱없이 힙에 저장 될 수있는 방법입니다. 또 다른 그냥 일반 클래스에서이를 데 : Foo
의 인스턴스와 관련된
public class Foo
{
int value1;
string name;
// etc
}
모든 변수는 힙에 저장됩니다. value1
의 값은 의 값이 문자열 참조 인 반면에 불과합니다.
이 때문에 "값 유형이 스택에 저장되고 참조 유형이 힙에 저장됩니다"라는 주장은 분명히 잘못되었습니다.
그러나 Eric Lippert는 rightly fond of pointing out이므로 스택/힙 구분은 구현 세부 사항입니다. 예를 들어, CLR 의 차기 버전에서는 메서드가 종료 된 후에도 필요하지 않다면 작동 할 수있는 경우 개체가 스택에 저장 될 수 있습니다.
그렇습니다. 전체 배열 은 전체적으로이 Array 객체 내에서 "박스형"이기 때문에 reach 요소에 대해 boxing이 수행되지 않았 음을 의미합니다.
값 유형이 힙에 배치되기 전에 박스 처리되어야한다는 요구 사항은 없습니다. 다음과 같은 세 가지 방법으로 힙에 값 유형을 배치 할 수 있습니다.
일반 오브젝트 내부에 값 유형을 배치합니다.
복싱으로.
배열 객체 안에 배치합니다.
이렇게 생각하면 메모리의 개체 위치는 어떤 종류의 형식인지 선언 된 위치에 의해 정의됩니다. 객체가 값 유형 인 경우 변수를 선언 한 곳의 값이 저장됩니다. 객체가 참조 유형 인 경우 참조은 실제 객체 인스턴스가 힙에있는 동안 변수를 선언 한 위치에 저장됩니다.
로컬 변수를 선언하면 스택에 변수가 선언됩니다. 따라서 값 유형의 값은 스택에 있습니다. 참조 유형의 참조는 스택에 있고 객체 인스턴스는 여전히 힙에 있습니다.
클래스 (참조 유형)에서 인스턴스 변수를 선언하면 효과적으로 힙에 인스턴스 변수가 선언됩니다. 값 유형의 값은 힙 (오브젝트 인스턴스에서)에 있습니다. 참조 유형의 참조는 힙 (오브젝트 인스턴스에서)에도 있으며, 오브젝트 인스턴스는 힙의 다른 위치에 있습니다.
구조체 (값 형식)에서 인스턴스 변수를 선언하면 해당 구조체가있는 곳은 기본 구조체가 선언 된 위치에 따라 달라집니다.
배열의 경우 int[]
, 배열은 참조 형식이므로 배열 형식이 "필드"로 선언 된 int
값을 해당 형식으로 생각하면 정수가 효율적으로 힙에있게됩니다.
나는 모든 것이 "메모리"에 저장된다고 말할 것입니다. (글쎄요 ... 실제로 저장되지 않은 상수와 쓸모 없거나 상수로 최적화 된 변수 제외). "유형"의 메모리 (레지스터/RAM/디스크, 직접 액세스 가능한 메모리에 대해서만 말하고 캐시를 건너 뛰기) 또는 조직 (스택, 힙, ???)에 대해서만 말할 수 있습니다 :-) 아마 당신은 "스택 메모리"라고했지만, 당신이 발견 한 것처럼 잘못된 것입니다. – xanatos
'int와 같은 값 형식 개체가 메모리에 저장되었습니다.'라는 메시지가 나에게 약간의 오해를 불러 일으킬 수 있습니다. 힙은 물론 메모리 일뿐입니다. – user492238