c/c++语言开发共享为什么在没有数据复制的情况下,像realloc()这样的标准C库中没有函数?

例如,我想要这样一个function:

char *dst = (char*)malloc(512); char *src = (char*)malloc(1024); ... dst = (char*)realloc(dst, 1024); memcpy(dst, src, 1024); 

如您所见,我只想让函数realloc()扩展缓冲区的大小,但C库中的realloc()可能会复制旧地址中的数据。 那么在我想要的任何库中都有一个函数吗?

    realloc尝试会在不复制的情况下扩展缓冲区,但只有在额外空间空闲时才能执行此操作。

    在你的情况下,你刚刚为src分配空间,而内存块可能只是使用了realloc所需的空间。 在这种情况下,它只能在其他地方分配更大的块并将数据复制到该块。

    为什么不呢:

     free(dst); dst = malloc(1024); 

    另请注意, realloc可以移动块并调整其大小,因此保持前一次调用malloccallocrealloc返回的旧指针可能不再引用相同的块。

    那么在我想要的任何库中都有一个函数吗?

    不,那里没有。 如果没有空间,系统应该如何扩展内存?

    例如,想象你这样做:

     char *a = malloc(2); char *b = malloc(2); 

    分配的内存现在可能如下所示:

      1 2 3 4 5 6 7  -------------------------  |  |  |  |  |  |  |  -------------------------   /  /  /            /  /  /     VVV  内存未使用/内存   “a”内部为“b”          记忆片  

    现在你做realloc(a,10); 。 系统不能简单地将存储器件扩展为“a”。 它会击中“b”使用的内存,所以它必须在内存中找到另外一个有10个连续空闲字节的位置,从旧内存块复制2个字节并返回指向这10个新字节的指针。

      以上就是c/c++开发分享为什么在没有数据复制的情况下,像realloc()这样的标准C库中没有函数?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544938.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐