`realloc`如何在后台实际工作?

时间:2014-01-29 16:54:05

标签: c memory-management realloc

realloc如何在后台实际运作? 如果旧地方没有足够的内存可用 这个分配两个/多个内存块和一个指针 指向那个和其他内部链接每个 其他或旧区域复制到足够的新地方 内存可用,指针正在更新到新地址并删除旧内存?

realloc编译器/操作系统依赖还是独立

3 个答案:

答案 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)

如果无法在现场调整旧指针的大小,则会复制内容,并释放旧内容。