2014-01-29 31 views
12

realloc如何在后台工作? 如果没有足够的可用内存在老地方做 这一分配二/许多内存块和一个指针 指向的是和其他在内部,每个 其他或复制到新的地方老区域链接哪里够 内存是否可用并且指针正在更新为新地址并删除旧内存?`realloc`如何在后台工作?

而且是realloc编译器/操作系统相关或独立

回答

11

realloc尝试扩展您的可用内存范围,如果在堆后面有足够的内存可用。如果不是那么它相当于malloc一个新的大小的块,memcpy你的内容那里,free旧的块。这与操作系统和编译器无关,取决于您链接的libc的实现。

在类似的注释:mremap/MREMAP_MAYMOVE(现代Linux上可用)将尝试扩展您的虚拟映射的请求大小。如果这不可行,那么它会将您的映射移动到一个新的虚拟地址,该虚拟地址具有足够的虚拟机空间,然后扩展您的映射。如果您经常调整大型映射的大小,因为没有进行物理复制,所以速度非常快。

+3

+1'mremap/MREMAP_MAYMOVE'。 – edmz

2

如果旧指针无法在分配新位置时调整大小,则将复制内容并释放旧内容。

8

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()接口是通用的。

+0

感谢您的清洁解决方案.. –