programing

realloc은 실제로 배경에서 어떻게 작동합니까?

newsource 2023. 11. 6. 21:53

realloc은 실제로 배경에서 어떻게 작동합니까?

어떻게.realloc실제로 백그라운드에서 일을 합니까?이전 위치에 사용 가능한 메모리가 충분하지 않은 경우 메모리 블록을 두 개/여러 개 할당하고 그와 다른 것을 가리키는 포인터 한 개가 내부적으로 서로 연결되어 있습니까? 아니면 메모리가 충분하고 포인터가 새 주소로 업데이트되고 이전 메모리가 삭제되는 이전 영역에 복사됩니까?

그리고 그것은realloc컴파일러/OS가 종속적입니까 아니면 독립적입니까?

realloc힙 뒤에 충분한 메모리를 사용할 수 있는 경우 사용 가능한 메모리 범위를 확장하려고 시도합니다.그렇지 않다면 다음과 같습니다.malloc새 사이즈의 블록이 있습니다.memcpy거기에 있는 당신의 컨텐츠들,free낡은 블록이것은 OS와 컴파일러 둘다 독립적이고 구현에 따라 다릅니다.libc당신이 상대할 수 있는.

이와 유사한 참고 사항:mremap/MREMAP_MAYMOVE(현대 리눅스에서 사용 가능)에서는 가상 매핑을 요청된 크기만큼 확장하려고 시도합니다.불가능한 경우 매핑을 뒤에 충분한 VM 공간이 있는 새 가상 주소로 이동한 다음 매핑을 확장합니다.물리적 복사가 수행되지 않으므로 큰 매핑의 크기를 자주 조정하는 경우 매우 빠릅니다.

구현:realloc()다음과 같이 보일 수 있습니다.

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;
}

이름이 다음으로 시작하는 여러 함수를 호출합니다.malloc_여기 있습니다. 이러한 기능들은 (내가 아는 한) 어떤 구현에도 실제로 존재하지 않습니다. 그러나 할당자가 실제로 내부적으로 이러한 작업을 수행하는 데 사용되는 플레이스홀더로 의도됩니다.

의 시행 이후.realloc()이러한 내부 도구에 따라 구현은 OS에 따라 달라집니다.하지만, 그realloc()인터페이스는 범용입니다.

이전 포인터의 크기를 조정할 수 없는 경우 새 포인터가 할당되면 내용이 복사되고 이전 포인터가 해제됩니다.

언급URL : https://stackoverflow.com/questions/21437482/how-realloc-work-actually-in-the-background