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