【问题标题】:How `realloc` work actually in the background?`realloc` 如何在后台实际工作?
【发布时间】:2014-02-21 15:12:46
【问题描述】:

realloc 如何在后台实际工作? 如果旧地方没有足够的内存可用 这一个分配两个/许多内存块和一个指针 指向那个和其他在内部与每个 其他或旧区域复制到足够的新地方 内存可用,指针正在更新到新地址并删除旧内存?

realloc编译器/操作系统依赖还是独立

【问题讨论】:

    标签: c memory-management realloc


    【解决方案1】:

    realloc 会尝试扩展您的可用内存范围,前提是堆上有足够的可用内存。如果不是,那么它相当于malloc 一个新大小的块,memcpy 你的内容在那里,free 旧块。这独立于操作系统和编译器,取决于您链接的libc 的实现。

    类似的说明:mremap/MREMAP_MAYMOVE(在现代 Linux 上可用)将尝试按请求的大小扩展您的虚拟映射。如果这是不可能的,那么它会将您的映射移动到一个新的虚拟地址,该地址后面有足够的 VM 空间,然后扩展您的映射。如果您经常调整大型映射的大小,这是非常快的,因为没有进行物理复制。

    【讨论】:

    • 其实如果size参数比上一次调用的低,realloc也可以减少内存范围。
    【解决方案2】:

    如果旧指针无法在分配新指针的位置调整大小,则会复制内容并释放旧指针。

    【讨论】:

      【解决方案3】:

      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;
      }
      

      请注意,我在这里调用了几个名称以malloc_ 开头的函数。这些功能在任何实现中都不存在(据我所知);它们旨在作为占位符,但分配器实际上在内部执行这些任务。

      由于realloc() 的实现依赖于这些内部工具,它的实现依赖于操作系统。但是,realloc() 接口是通用的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2019-04-09
        相关资源
        最近更新 更多