2010-04-10 5 views

답변

0

반드시 그렇지는 않음. 다른 할당 메커니즘이있을 수 있습니다.

많은 사람들이 할당 된 청크 사이에 메타 데이터를 저장하고 객체 크기에 따라 분할 힙을 저장합니다. 반환 된 포인터의 연속성에 의존 할 수 없습니다.

4

예, 할당은 사실상 연속적입니다 (하나의 malloc() 호출로 얻은 경우). 물리적으로 연속적이지 않을 수도 있지만, 애플리케이션 관점에서 보았을 때 일반적으로 신경 쓰지는 않습니다.

2

정확하게 무엇을 요구하는지에 따라 다릅니다. 예를 들어,이 C 코드가 있다고 가정 해 보겠습니다.

char* a = malloc(100); 
char* b = malloc(100); 

a 및 b 포인터에 각각 100 바이트가 할당되어 있다고 가정 해 보겠습니다. 그러나 b에 할당 된 100 바이트가 a에 할당 된 100 바이트 바로 뒤에 있거나 또는 그 반대의 위치에 있다고 가정 할 수 없습니다. 그래서 그런 의미에서, 그들은 연속적이지 않습니다.

그러나 100 바이트의 각 블록 내에서 100 바이트는 프로그램의 관점에서 연속적입니다. 즉, a[1]a[0]a[2]에서 1 바이트 떨어져 있습니다.

2

가상 메모리의 개념을 실제 메모리 중 하나와 구분해야합니다.

할당 된 모든 청크 (하나의 객체 또는 객체 배열)는 연속적인 가상 공간 (동적 메모리 할당자가 사용자에게 제공 한 주소에서 시작)을 가지지 만 실제 메모리에서 어떻게 분할되는지 기본 운영 체제는 메모리를 관리합니다.

물론 가상 메모리가 존재하지 않는다면 그것들은 일치 할 것입니다, 그렇지 않으면 그것을 사용하고있는 프로그램은 연속되지만 메모리의 물리적 레이아웃은 아닙니다.