`realloc`如何在后台实际工作?
realloc
如何在后台实际工作? 如果在旧地方没有足够的可用内存,那么这个分配两个/多个内存块和一个指向该内存块的指针和其他指针在内部相互链接,或者旧区域被复制到新的位置,其中有足够的内存可用且指针正在更新到新地址并删除旧内存?
并且realloc
是编译器/操作系统依赖还是独立 ?
realloc
尝试扩展可用内存范围,如果堆上有足够的内存可用。 如果不是那么它相当于malloc
一个新大小的块, memcpy
你的内容, free
旧块。 这与OS和编译器无关,取决于您链接的libc
的实现。
类似的说明: mremap/MREMAP_MAYMOVE
(在现代Linux上可用)将尝试按请求的大小扩展虚拟映射。 如果这不可能,那么它会将您的映射移动到一个新的虚拟地址,后面有足够的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_
here开头的函数。 在任何实现中,这些函数实际上并不存在(据我所知); 它们用作占位符,但分配器实际上在内部执行这些任务。
由于realloc()
的实现依赖于这些内部工具,因此其实现依赖于操作系统。 但是, realloc()
接口是通用的。
如果旧指针无法在现场resize,则会分配新指针,复制内容并释放旧内容。