为什么在没有数据复制的情况下,像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
可以移动块并调整其大小,因此保持前一次调用malloc
, calloc
或realloc
返回的旧指针可能不再引用相同的块。
那么在我想要的任何库中都有一个函数吗?
不,那里没有。 如果没有空间,系统应该如何扩展内存?
例如,想象你这样做:
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个新字节的指针。