realloc
如何在后台工作? 如果没有足够的可用内存在老地方做 这一分配二/许多内存块和一个指针 指向的是和其他在内部,每个 其他或复制到新的地方老区域链接哪里够 内存是否可用并且指针正在更新为新地址并删除旧内存?`realloc`如何在后台工作?
而且是realloc
是编译器/操作系统相关或独立?
realloc
如何在后台工作? 如果没有足够的可用内存在老地方做 这一分配二/许多内存块和一个指针 指向的是和其他在内部,每个 其他或复制到新的地方老区域链接哪里够 内存是否可用并且指针正在更新为新地址并删除旧内存?`realloc`如何在后台工作?
而且是realloc
是编译器/操作系统相关或独立?
realloc
尝试扩展您的可用内存范围,如果在堆后面有足够的内存可用。如果不是那么它相当于malloc
一个新的大小的块,memcpy
你的内容那里,free
旧的块。这与操作系统和编译器无关,取决于您链接的libc
的实现。
在类似的注释:mremap/MREMAP_MAYMOVE
(现代Linux上可用)将尝试扩展您的虚拟映射的请求大小。如果这不可行,那么它会将您的映射移动到一个新的虚拟地址,该虚拟地址具有足够的虚拟机空间,然后扩展您的映射。如果您经常调整大型映射的大小,因为没有进行物理复制,所以速度非常快。
如果旧指针无法在分配新位置时调整大小,则将复制内容并释放旧内容。
的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()
接口是通用的。
感谢您的清洁解决方案.. –
+1'mremap/MREMAP_MAYMOVE'。 – edmz