2011-11-16 2 views
1

이 코드 줄을 디버깅 할 때 ms/ms2가 값 형식의 인스턴스이며 스택에 할당되며 o (boxed MyStruct 인스턴스)는 참조입니다. 관리되는 힙에 할당됩니다.힙 및 스택을 설명하는 방법은 서로 가까워지지 않습니다.

Visual Studio의 조사 식 창에서 ms와 ms2의 주소를 볼 수 있습니다. 각각 0x0024f104와 0x0024f0f0입니다. 따라서 스택은 주소 공간의 아래쪽을 향해 아래로 자라고 있습니다. 스택과 힙은 서로를 향해 커지기 때문에 관리되는 힙의 주소 영역은 0x0024f0f0보다 작아야합니다. 그러나 o의 주소는 실제로 0x01e9312c입니다. 즉, 힙이 스택쪽으로 커지지 않음을 의미합니다 (새 개체가 힙에 할당 된 것을 관찰 할 수는 있지만 그 주소는 실제로 증가합니다).

누군가 설명해 드릴 수 있습니까?

MyStruct ms = new MyStruct(1, 2, 4, 8); //0x0024f104, 16 bytes for ms 
Object o = ms;       //0x0024f100, 4 bytes for variable o 
MyStruct ms2 = (MyStruct)o;    //0x0024f0f0, 16 bytes for ms2 
+0

"주소 공간 레이아웃 임의 화는 기본적으로 Vista에서 시작하여 활성화됩니다"(http://en.wikipedia.org/wiki/Address_space_layout_randomization#Microsoft_Windows). 그래서 예, 이제는 "스택과 힙이 서로를 향해 성장함"이 더 이상 유효하지 않음을 인정합니다. – kennyzx

+0

아니요. 이유가 아닙니다. 이것은 메모리 관리 측면 중 하나 일뿐입니다. 프로세스의 가상 주소 공간에있는 스택 및 기타 메모리 부분은 '성장'할 필요가 없기 때문에 사용할 수있는 위치에 할당됩니다. –

답변

1

서로를 향해 성장하는 스택과 헤드는 약 30 년 전에 유효한 개념이었습니다.

일반적으로 개체가있는 메모리 위치를 신경 쓰지 않아도됩니다.

+0

공격을 구현하려고 시도하지 않는 한) – lc2817

+1

또는 SQL Server와 비슷한 디자인을 사용합니다. 그러나이 경우 처음부터 그런 질문을하지 마십시오 :-) –

+0

내 생각에 여전히 유효한 개념입니다. 프로세스의 가상 주소 공간은 현대 운영 체제에서 변경되지 않은 부분입니다. 이 경우에는 공용 언어 런타임 (CLR)이 일부 추가 작업을 수행하므로 힙 (heap)이 주소 공간의 어느 위치 에나있을 수 있으므로 "관리되는 힙 (heap)"이라고합니다. – kennyzx

관련 문제