memory-management - 使用 gcc/linux 就地重新分配

标签 memory-management realloc

有这样的事吗?我的意思是一些函数,如果可能的话,它会重新分配内存而不移动它,或者如果不可能的话,什么也不做。在 Visual C 中有 _expand 可以满足我的要求。有人知道其他平台的等价物,特别是 gcc/linux 吗?我最感兴趣的是在可能的情况下就地缩小内存(标准 realloc 可能会移动内存,即使它的大小减小,以防有人问)。

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

最佳答案

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

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

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

  • 将可调整大小的对象分成两个分配,一个固定大小的“头”对象指向第二个可变大小的对象。
  • 对于需要指向可变大小对象的其他对象,将指向头对象的指针和整数偏移量(size_tptrdiff_t)存储到可变大小对象中。

  • 现在,即使可变大小对象移动到新地址,对它的任何引用都不会失效。

    如果你从多个线程中使用这些对象,你应该在头对象中放置一个读写锁,当你需要访问可变大小对象时对其进行读锁定,并在调整可变大小对象时对其进行写锁定目的。

    关于memory-management - 使用 gcc/linux 就地重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337208/

    相关文章:

    Java - 用于 native /非 native 例程的自定义分配器接口(interface)

    c - 是否可以手动检查 c 中的内存对齐?

    c - 如何在 C 中创建动态字符串数组?

    c - 重新分配第二维

    javascript - 对象创建函数

    javascript - 我怎样才能知道有多少内存分配给了一个javascript对象?

    c++ - 从没有锁的多个线程读取动态/变化的数据?它会导致崩溃吗?或者只是损坏的变量?

    c - 使用gdb--仍然找不到malloc错误

    c - 在c中打印字符串数组的第一个元素时出现段错误

    c++ - 重新分配(): invalid old size even when malloc() is used to allocate memory