2016-08-30 3 views
2

배열에 고정 된 메모리 영역이 할당되었다고 가정하면 배열의 길이가 불변이라는 것을 완전히 이해할 수 있습니다.배열은 메모리에서 어떻게 처리됩니까?

Array [10]이 있다고 가정 해 보겠습니다. 인접 메모리를 10 슬롯 할당 할 수 있습니까? 그리고 이러한 슬롯이 인접하고 사전 결정된 위치에 있기 때문에 색인 기반 조회가 빠릅니다.

하지만 크기가 불규칙한 배열에 복잡한 유형을 넣을 경우 어떻게됩니까? 배열의 실제 객체는 같은 유형일 수 있지만 보유한 데이터의 크기가 크게 다를 수 있습니다.

.Net은 어떻게 처리합니까? 나는 객체에 실제 데이터를 저장하기 위해 순차적 인 메모리를 할당하지 않는다고 생각하지만 이것에 대한 권위있는 답변을 원합니다. 예를 들어 - 개체가 특정 크기를 초과하는 경우 비 순차 메모리 만 사용합니까? 객체의 크기가 지속적으로 변경되는 경우 저장소 위치를 최적화하려고 계속 시도할까요? 내가 서브 배열과 하위 배열에 할당 MyClass의 배열 및 런타임 시작이 있으면 지금

public class MyClass 
{ 
    public MyClass[] PotentiallyHugeNestedStructure 
} 

:

이 클래스를 생각해 보자. 나는 거친 배열의 광대 한 수집으로 끝날 수있다.

그래서 .net에서 어떻게 처리하나요?

+3

* 배열의 실제 개체 *?!아니요, 배열에는 객체 자체가 아닌 객체 메모리 위치 (관리되는 힙에 있음)에 대한 참조가 있습니다! – user3185569

+0

@ user3185569 그래서 순차적으로 연결된 목록 일뿐입니다. –

+0

'배열의 실제 객체는 같은 유형일 수 있지만 보유한 데이터의 크기가 크게 다를 수 있습니다. 데이터가 다르더라도 인덱스 당 할당 된 저장 영역은 할당 된 메모리만큼 (int 4 바이트) 동일합니다 그 블록에 대해 저장된 값을 유지할 수 있습니다 – Sherlock

답변

3

참조 유형의 배열에서 배열의 각 요소는 관리 힙의 객체를 가리키는 참조를 보유합니다.

배열 자체의 크기 범위 내에서 (지정된대로) 기본 형식 배열보다 개체 배열을 갖는 단점이 없습니다 (배열 요소 참조 메모리의 배열 크기와 아무런 관련이 없음).

인덱스로 요소를 액세스 할 수있는 범위에서 인덱스로 액세스 할 때 차이가 없습니다. 힙에서 참조에 의해 객체를 검색하기위한 오버 헤드가 있지만, 매우 빠릅니다 (참조는 대개 메모리 위치에 대한 오프셋을 나타내는 숫자이므로).

enter image description here

이미지 : 제프리 리히터 CLR 비아 C#

myControls 오브젝트의 배열은, 각각의 소자

아래 이미지 어레이 들고 치형 대 참조 타입 채 배열을 보여 Null (기본값) 또는 객체에 대한 참조 (32 비트 시스템에서는 4 바이트, 64 비트 시스템에서는 8 바이트)를 유지합니다.

사이드 참고 : 픽처에 지정된 오버 헤드를 포함하는 어레이에 대한 정보 :

  • 차원
  • 각 차원의 하한 (0는 대부분의 경우)
  • 의 길이 정렬.
+1

_ "그래서 원시 타입의 배열에 객체 배열을 갖는 데는 단점이 없습니다. 매우 빠른 방법으로 색인을 통해 목록의 객체에 액세스 할 수 있습니다"_ - 여러 가지 이유로이 문은 위험합니다 부정확하다. 값 유형의 배열이 참조 유형의 배열보다 훨씬 뛰어난 경우가 많이 있습니다. 가장 큰 요인 중 하나는 메모리 지역과 캐싱에 미치는 영향이지만 다른 문제가 있습니다. –

+0

@PeterDuniho 나는 내가 쓴 것이 충분히 명확하지 않다고 생각한다. 나는 그것이 OP가 말한 것에 대한 회신으로 언급했다. 그는 객체 배열이 사실 일 필요가없는 원시 타입 배열보다 메모리에서 더 많은 크기를 차지하지만 일부 값 유형은 더 많은 메모리를 참조해야하므로 다른 방법이 될 수도 있습니다. 나는 그 편집이 이제 분명 해졌기를 바란다. – user3185569

+0

동급 참조 유형과 동일한 효과적인 작업을 수행하는 동등한 참조 유형보다 _more_ 메모리를 사용하는 값 ​​유형의 예를 제공해주십시오. –

관련 문제