Memory management 使用gcc/linux的就地realloc

Memory management 使用gcc/linux的就地realloc,memory-management,realloc,Memory Management,Realloc,有这样的事吗?我指的是一些函数,如果可能的话,它可以在不移动内存的情况下重新分配内存,如果不可能的话,它什么也不做。在visualc中,有一个_expand,它实现了我想要的功能。有人知道其他平台的等价物吗,特别是gcc/linux?我最感兴趣的是尽可能地缩小内存(如果有人要求,标准realloc可能会在内存大小减小时移动内存) 我知道没有标准的方法可以做到这一点,我明确要求使用依赖于实现的肮脏的黑客技巧。列出你知道的任何在某处有用的东西。上有人问过类似的问题。我看到的一个更合理的答案是在初始分

有这样的事吗?我指的是一些函数,如果可能的话,它可以在不移动内存的情况下重新分配内存,如果不可能的话,它什么也不做。在visualc中,有一个_expand,它实现了我想要的功能。有人知道其他平台的等价物吗,特别是gcc/linux?我最感兴趣的是尽可能地缩小内存(如果有人要求,标准realloc可能会在内存大小减小时移动内存)


我知道没有标准的方法可以做到这一点,我明确要求使用依赖于实现的肮脏的黑客技巧。列出你知道的任何在某处有用的东西。

上有人问过类似的问题。我看到的一个更合理的答案是在初始分配中使用
mmap
(使用
MAP\u ANONYMOUS
标志)并在没有
mremap\u MAYMOVE
标志的情况下调用
mremap
。但是,这种方法的一个限制是,分配大小必须是系统页面大小的精确倍数。

除了使用
mmap
munmap
来消除您不需要的多余部分(或者
mremap
,它们可以做同样的事情,但不是标准),没有办法减少已分配内存块的大小。而且
mmap
具有页面粒度(通常为4k),因此除非处理非常大的对象,否则使用它将比只保留过大的对象而不收缩它们更糟糕

话虽如此,就地缩减内存可能不是一个好主意,因为释放的内存将严重碎片化。一个好的
realloc
实现将在显著缩小块时移动块,作为对内存进行碎片整理的机会

我猜您的情况是,您有一个分配的内存块,其中有许多其他结构将指针放入其中,您不想使这些指针无效。如果是这种情况,这里有一个可能的通用解决方案:

  • 将可调整大小的对象分成两个分配,一个固定大小的“头”对象指向第二个可变大小的对象
  • 对于需要指向可变大小对象的其他对象,将指向头部对象的指针和整数偏移(
    size\u t
    ptrdiff\u t
    )存储到可变大小对象中
  • 现在,即使可变大小对象移动到一个新地址,对它的任何引用都不会失效

    如果从多个线程使用这些对象,则应该在head对象中设置读写锁,在需要访问可变大小对象时读取锁定,在调整可变大小对象的大小时写入锁定