2014-01-29 2 views
12

realloc은 실제로 백그라운드에서 작동합니까? 충분한 메모리가 된 장소에서 사용할 수 없을 경우는 그런 가리키는 이/많은 메모리 블록 한 포인터 할당이 일을 수행하고 다른 하나는 내부적으로 각 다른 또는 새로운 장소로 복사 이전 지역과 연결되는 곳 충분 메모리를 사용할 수 있고 포인터가 새 주소로 업데이트되고 오래된 메모리를 삭제합니까?`realloc`은 백그라운드에서 실제로 어떻게 작동하나요?

그리고 realloc입니다. 컴파일러/OS에 종속적이거나 독립적입니다.?

답변

11

realloc 힙에 충분한 메모리가있는 경우 사용 가능한 메모리 범위를 확장하려고 시도합니다. 그렇지 않다면 malloc 새로운 크기의 블록, memcpy 거기 내용, free 이전 블록과 동일합니다. 이것은 OS와 컴파일러에 독립적이며, 사용자가 링크하는 libc의 구현에 달려 있습니다.

비슷한 메모 : mremap/MREMAP_MAYMOVE (최신 Linux에서 사용 가능)은 요청한 크기만큼 가상 매핑을 확장하려고 시도합니다. 그렇게 할 수 없다면 매핑 뒤에 충분한 VM 공간이있는 새 가상 주소로 매핑을 이동 한 다음 매핑을 확장합니다. 물리적 인 복사가 없기 때문에 큰 매핑의 크기를 자주 조정할 경우 매우 빠릅니다.

+3

+1 'mremap/MREMAP_MAYMOVE'의 경우 +1입니다. – edmz

2

새 포인터가 할당 된 위치에서 이전 포인터의 크기를 조정할 수 없으면 내용을 복사하고 이전 포인터를 해제합니다. 내가 여기 malloc_로 시작하는 이름을 가진 여러 함수를 호출하고있어

void * realloc(void *ptr, size_t size) 
{ 
    // realloc() on a NULL pointer is the same as malloc(). 
    if (ptr == NULL) 
     return malloc(size); 

    size_t oldsize = malloc_getsize(ptr); 

    // Are we shrinking an allocation? That's easy. 
    if (size < oldsize) { 
     malloc_setsize(ptr, size); 
     return ptr; 
    } 

    // Can we grow this allocation in place? 
    if (malloc_can_grow(ptr, size)) { 
     malloc_setsize(ptr, size); 
     return ptr; 
    } 

    // Create a new allocation, move the data there, and free the old one. 
    void *newptr = malloc(size); 
    if (newptr == NULL) 
     return NULL; 
    memcpy(newptr, ptr, oldsize); 
    free(ptr); 
    return newptr; 
} 

참고 :

8

realloc()의 구현은 다음과 같이 보일 수 있습니다. 이 기능들은 실제로 어떤 구현에서나 존재하지 않습니다. 할당자가 실제로 이러한 작업을 내부적으로 수행하기위한 자리 표시 자로 사용됩니다.

realloc()의 구현은 이러한 내부 도구에 따라 다르므로 해당 구현은 OS에 따라 다릅니다. 그러나 realloc() 인터페이스는 보편적입니다.

+0

깨끗한 솔루션을 주셔서 감사합니다 .. –