realloc
如何在后台实际运作?
如果旧地方没有足够的内存可用
这个分配两个/多个内存块和一个指针
指向那个和其他内部链接每个
其他或旧区域复制到足够的新地方
内存可用,指针正在更新到新地址并删除旧内存?
realloc
是编译器/操作系统依赖还是独立?
答案 0 :(得分:16)
realloc
尝试扩展可用内存范围,如果堆上有足够的内存可用。如果没有,则相当于malloc
新大小的块,memcpy
您的内容,free
旧块。这与操作系统和编译器无关,取决于您链接的libc
的实现。
在类似的说明中:mremap/MREMAP_MAYMOVE
(在现代Linux上可用)将尝试按请求的大小扩展虚拟映射。如果这不可能,那么它会将您的映射移动到一个新的虚拟地址,后面有足够的VM空间,然后扩展您的映射。如果您经常调整大型映射的大小,这是非常快的,因为没有进行物理复制。
答案 1 :(得分:10)
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()
的实现依赖于这些内部工具,因此其实现依赖于操作系统。但是,realloc()
接口是通用的。
答案 2 :(得分:3)
如果无法在现场调整旧指针的大小,则会复制内容,并释放旧内容。