이 코드 줄을 디버깅 할 때 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
"주소 공간 레이아웃 임의 화는 기본적으로 Vista에서 시작하여 활성화됩니다"(http://en.wikipedia.org/wiki/Address_space_layout_randomization#Microsoft_Windows). 그래서 예, 이제는 "스택과 힙이 서로를 향해 성장함"이 더 이상 유효하지 않음을 인정합니다. – kennyzx
아니요. 이유가 아닙니다. 이것은 메모리 관리 측면 중 하나 일뿐입니다. 프로세스의 가상 주소 공간에있는 스택 및 기타 메모리 부분은 '성장'할 필요가 없기 때문에 사용할 수있는 위치에 할당됩니다. –