문제

는 무엇입의 메모리 레이아웃니다.NET 배열?

예를 들어 이 배열:

Int32[] x = new Int32[10];

을 이해 대량의 배열은 다음과 같다:

0000111122223333444455556666777788889999

각 문자는 하나의 바이트를,그리고 자리에 해당하수으로 배열입니다.

또한,그가 있다는 것을 알아 유형을 참조 및 syncblock-인덱스에 대한 모든 개체가,그래서 위의 조정될 수 있습니다.

ttttssss0000111122223333444455556666777788889999
        ^
        +- object reference points here

또한,배열의 길이 저장되어야 하는,그래서 아마도 이것은 더 정확:

ttttssssllll0000111122223333444455556666777788889999
        ^
        +- object reference points here

이 완료된 작업은 무엇입니까?은 거기에 더 많은 데이터 배열에서?

난 이유를 묻는 것은 우리는 얼마나 많은 메모리의 몇 가지 서로 다른 메모리의 표현을 오히려 큰 데이터 코퍼스와의 크기는 배열에 따라 비트,그래서 오버헤드도 큰 영향을 미치는 하나의 솔루션이지만,아마도 그렇게 많이 있습니다.

그래서 기본적으로,배열,얼마나 오버헤드가 있는 기본적으로 나의 질문입니다.

과하기 전에 배열은 나쁜 팀이 깨어나는 이 솔루션의 일부입니다,정전기면 참조-자주식의 것 그래서 사용할 경우 확장 가능한 목록은 여기에 필요하지 않습니다.

도움이 되었습니까?

해결책

좋은 질문. 나는 찾았다 이것 값 유형과 참조 유형 모두에 대한 블록 다이어그램이 포함 된 기사. 또한 이것을 참조하십시오 기사 리커가 말한 곳 :

SNIP] 각 배열에는 이와 관련된 몇 가지 추가 오버 헤드 정보가 있습니다. 이 정보에는 배열의 순위 (치수 수), 배열의 각 차원 (거의 항상 0)의 하한 및 각 차원의 길이가 포함됩니다. 오버 헤드에는 배열의 각 요소의 유형도 포함됩니다.

다른 팁

이것을 조사하는 한 가지 방법은 WindBG의 코드를 보는 것입니다. 아래 코드가 주어지면 힙에 어떻게 나타나는지 살펴 보겠습니다.

var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

가장 먼저해야 할 일은 인스턴스를 찾는 것입니다. 내가 이것을 현지인으로 만들었습니다 Main(), 인스턴스의 주소를 쉽게 찾을 수 있습니다.

주소에서 우리는 실제 인스턴스를 버릴 수 있습니다.

0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None

이것은 10 개의 요소와 총 크기 52 바이트가있는 INT32 어레이임을 알려줍니다.

인스턴스가있는 곳에 메모리를 덤프합시다.

0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00  ..0.............
0141ffd0  02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00  ................
0141ffe0  06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00  ................
0141fff0  00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00  ..... @.........
01420000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01420010  10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03  .m.........@P.=.
01420020  03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00  ................
01420030  1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00  .$@.............

52 바이트에 대한 괄호를 삽입했습니다.

  • 처음 4 바이트는 01309584의 메소드 테이블에 대한 참조입니다.
  • 그런 다음 배열의 길이에 대해 4 바이트.
  • 다음은 숫자 0 ~ 9 (각 4 바이트)입니다.
  • 마지막 4 바이트는 널입니다. 완전히 확실하지는 않지만 인스턴스가 잠금에 사용되는 경우 SyncBlock 배열에 대한 참조가 저장되는 곳이어야합니다.

편집 : 첫 번째 게시에서 길이를 잊어 버렸습니다.

Romkyns가 인스턴스가 실제로 주소에서 시작되고 첫 번째 필드는 syncblock이기 때문에 목록은 약간 부정확합니다.

좋은 질문입니다!고 싶어 그것을 보고 자신을 위해,그리고 그것 보다 좋은 직접 만져볼 수 있는 기회도 CorDbg.exe...

그것은 보인다는 단순한 정수 배열 형식은 다음과 같습니다.

ssssllll000011112222....nnnn0000

여기서의 동기화,블록 l 의 길이 배열한 다음,개별적인 요소입니다.그것은 보인다가 마침내 0 끝에,내가지는 것입니다.

에 대한 다차원 배열:

ssssttttl1l1l2l2????????
    000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000

여기서의 동기화를 차단,t 의 총수 요소,l1 길이의 첫 번째 차원,l2 길이의 두 번째 차원,다음 두 가지를 제로?, 다음의 모든 요소를 순차적으로,그리고 마지막으로 제시.

체 배열으로 처리됩니다 정수 배열,내용 참조를 이 시간입니다.가변 배열은 개체 배열은 어디에 참조점을 다른 배열입니다.

배열 객체는 차원의 수와 각 차원의 길이를 저장해야합니다. 모델에 추가 할 데이터 요소가 하나 이상 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top