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()
界面是通用的.