`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` 如何在后台实际工作?的主要内容,如果未能解决你的问题,请参考以下文章

realloc 如何知道要复制多少?

在C中用realloc()截断字符串?

malloc() 和 realloc() 结构

关于new操作符如何实现C中的realloc函数

malloc,realloc,与calloc

动态内存分配如何工作[重复]