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
'programing' 카테고리의 다른 글
현재 사용자 주문 InWooCommerce에서 주문 ID 가져오기 (0) | 2023.11.06 |
---|---|
grails 컨트롤러에서 ajax 요청 또는 브라우저 요청 식별 (0) | 2023.11.06 |
제출 시 양식 리디렉션 또는 새로 고침을 방지하시겠습니까? (0) | 2023.11.06 |
클릭()에서 jQuery 클릭을 사용하여 앵커를 처리합니다. (0) | 2023.11.06 |
CSS의 모든 N번째 요소 선택 (0) | 2023.11.06 |