`realloc` 如何在后台实际工作?
Posted
技术标签:
【中文标题】`realloc` 如何在后台实际工作?【英文标题】:How `realloc` work actually in the background? 【发布时间】:2014-02-21 15:12:46 【问题描述】:realloc
如何在后台实际工作?
如果旧地方没有足够的内存可用
这一个分配两个/许多内存块和一个指针
指向那个和其他在内部与每个
其他或旧区域复制到足够的新地方
内存可用,指针正在更新到新地址并删除旧内存?
realloc
是编译器/操作系统依赖还是独立?
【问题讨论】:
【参考方案1】:realloc
会尝试扩展您的可用内存范围,前提是堆上有足够的可用内存。如果不是,那么它相当于malloc
一个新大小的块,memcpy
你的内容在那里,free
旧块。这独立于操作系统和编译器,取决于您链接的libc
的实现。
类似的说明:mremap/MREMAP_MAYMOVE
(在现代 Linux 上可用)将尝试按请求的大小扩展您的虚拟映射。如果这是不可能的,那么它会将您的映射移动到一个新的虚拟地址,该地址后面有足够的 VM 空间,然后扩展您的映射。如果您经常调整大型映射的大小,这是非常快的,因为没有进行物理复制。
【讨论】:
其实如果size
参数比上一次调用的低,realloc也可以减少内存范围。【参考方案2】:
如果旧指针无法在分配新指针的位置调整大小,则会复制内容并释放旧指针。
【讨论】:
【参考方案3】: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()
接口是通用的。
【讨论】:
以上是关于`realloc` 如何在后台实际工作?的主要内容,如果未能解决你的问题,请参考以下文章