2017-01-30 1 views
1

Microsoft Visual Studio 2008을 사용하고 있습니다.C++은 어디에서 메모리에 스택과 힙을 생성합니까?

개체에 대한 포인터를 만들면 메모리 주소가 입력됩니다.이 경우 내 주소는 8 자리 16 진수입니다. 예 : 0x02e97fc0

8 자리의 16 진수로 컴퓨터는 4GB의 메모리를 주소 지정할 수 있습니다. 내 컴퓨터에 8GB의 메모리가 있습니다.

  1. 내 IDE가 내 메모리에서 4GB 이상을 사용하지 않는다는 의미입니까?

  2. IDE가 사용하지 않은 8GB 중 처음 4GB 또는 4GB 만 처리 할 수 ​​있습니까?

질문은 사용 된 메모리의 크기에 관한 것만이 아닙니다. 그것은 또한 사용 된 메모리의 위치에 관한 것입니다. Latter는 여기서 자세히 설명하지 않았습니다 : The maximum amount of memory any single process on Windows can address

+0

:

그것에 대해 코멘트에 일부 Microsoft 소스를 발견. – NathanOliver

+1

64 비트 타겟 용으로 컴파일하면 64 비트 포인터도 부여되므로 더 많은 메모리 공간을 처리 할 수 ​​있습니다. – Steeve

+0

[Windows에서 단일 프로세스로 처리 할 수있는 최대 메모리 양] 가능한 복제본 (http://stackoverflow.com/questions/11891593/the-maximum-amount-of-memory-any-single-process-on-windows) -can-address) –

답변

4

어디에서 C++이 스택과 힙을 메모리에 생성합니까?

음, C++은 실제로 메모리를 처리하지 않으므로 운영 체제에 그렇게하도록 요청합니다. 이진 객체 (.exe, .dll, .so ...)가 메모리에로드되면 스택에 메모리를 할당하는 OS입니다. new으로 동적으로 메모리를 할당하면 OS에 힙의 일부 공간을 요청하게됩니다.

1) 내 IDE가 내 메모리에서 4GB 이상을 사용하지 않는다는 의미입니까?

아니요. 실제로 Windows와 같은 최신 OS는 virtual address space이라는 이름을 사용합니다. 이 프로그램은 분명히 인접한 메모리 세그먼트 (0x1000 ~ 0xffff)를 가상 블록 영역에 매핑합니다. 당신은 당신의 물건이 정말로 기억 속에있는 곳을 절대적으로 보장하지 못합니다. 주소가 역 참조 될 때, OS는 마술을하고 프로그램이 메모리의 실제 주소에 액세스하게합니다. 32 개 비트 주소를 갖는

Diagram of relationship between the virtual and physical address spaces.

은 프로그램의 단일 인스턴스가 4GB의 메모리 것이 더 사용할 수 없음을 의미합니다. OS가 가상 주소의 동일한 세그먼트 (0x00000000 ~ 0xffffffff)의 내부에 두 개의 다른 실제 주소 세그먼트를 할당 할 수 있으므로 동일한 프로그램의 두 인스턴스가 가능합니다. 그리고 Windows는 자신의 프로세스를 위해 더 많은 중복 주소 공간을 할당합니다.

2) IDE가 사용하지 않은 8GB 중 처음 4GB 메모리 또는 4GB 만 처리 할 수 ​​있습니까?

모두. 심지어 인접하지 않은 메모리, 심지어 디스크 메모리 ... 아무도 말할 수 있습니다. 그들이 값을 변경하지 않는 한 0의 자주 삭제됩니다 선도 https://msdn.microsoft.com/en-us/library/aa366778.aspx

+0

그 말은, 객체의 주소를 검색 할 때 실제 주소가 아닌 가상 주소 만 가져 오는 것입니까? (그렇지 않으면 다른 프로그램의 일부가 손상 될 수 있습니다.) – Attis

+0

예, 가상 주소 만 취급합니다. 이것은 서로간에 프로세스를 보호 할뿐만 아니라 운영 체제가 실제 메모리를보다 효율적으로 처리하도록합니다. – YSC

관련 문제