有这样的事吗?我的意思是一些函数,如果可能的话,它会重新分配内存而不移动它,或者如果不可能的话,什么也不做。在 Visual C 中有 _expand 可以满足我的要求。有人知道其他平台的等价物,特别是 gcc/linux 吗?我最感兴趣的是在可能的情况下就地缩小内存(标准 realloc 可能会移动内存,即使它的大小减小,以防有人问)。
我知道没有标准的方法可以做到这一点,我明确要求依赖于实现的肮脏的hackish技巧。列出任何你知道在某处有效的东西。
最佳答案
除了使用 mmap
和 munmap
为了消除您不需要的多余部分(或 mremap
,它可以做同样的事情但不是标准的),没有办法减少分配的内存块的大小。和mmap
具有页面粒度(通常为 4k),因此除非您正在处理非常大的对象,否则使用它会比只留下过大的对象并且根本不缩小它们更糟糕。
话虽如此,就地缩小内存可能不是一个好主意,因为释放的内存将严重碎片化。不错realloc
实现将希望在显着缩小块时移动 block ,作为对内存进行碎片整理的机会。
我猜你的情况是你有一个分配的内存块,其中有许多其他结构持有指向它的指针,并且你不想使这些指针无效。如果是这种情况,这是一个可能的通用解决方案:
size_t
或 ptrdiff_t
)存储到可变大小对象中。 现在,即使可变大小对象移动到新地址,对它的任何引用都不会失效。
如果你从多个线程中使用这些对象,你应该在头对象中放置一个读写锁,当你需要访问可变大小对象时对其进行读锁定,并在调整可变大小对象时对其进行写锁定目的。
关于memory-management - 使用 gcc/linux 就地重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337208/