`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,则会分配新指针,复制内容并释放旧内容。