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

Rav*_*pta 19 c memory-management realloc

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

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

Ser*_* L. 18

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

类似的说明:( mremap/MREMAP_MAYMOVE在现代Linux上可用)将尝试按请求的大小扩展虚拟映射.如果这不可能,那么它会将您的映射移动到一个新的虚拟地址,后面有足够的VM空间,然后扩展您的映射.如果您经常调整大型映射的大小,这是非常快的,因为没有进行物理复制.


dus*_*uff 11

的实现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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在调用几个名称以malloc_此处开头的函数.在任何实现中,这些函数实际上并不存在(据我所知); 它们用作占位符,但分配器实际上在内部执行这些任务.

由于实现realloc()依赖于这些内部工具,因此其实现依赖于操作系统.但是,realloc()界面是通用的.


Mar*_*ian 5

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