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