Mat*_*att 11 c malloc allocation realloc calloc
每个人都知道:
realloc 调整现有内存块的大小或将其复制到更大的块.calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.为什么C标准没有提供如下结合上述两者的功能?
void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)
调整大型哈希表或自定义内存池的大小不是很有用吗?
abe*_*nky 15
通常在C中,标准库的要点不是提供丰富的酷函数.它是提供一组必不可少的构建块,您可以从中构建自己的酷功能.
你的提议recalloc很容易写,因此不是标准的lib应该提供的.
其他语言采用不同的方法:C#和Java具有超级丰富的库,甚至使复杂的任务变得微不足道.但它们带来了巨大的开销.C具有最小的开销,并且有助于使其可移植到各种嵌入式设备.
我假设你只关注数组的新部分:
并非每个内存分配器都知道您在数组中使用了多少内存.例如,如果我这样做:
char* foo = malloc(1);
Run Code Online (Sandbox Code Playgroud)
foo现在指向至少一块1字节大的内存.但是大多数分配器将分配超过1个字节(例如,8,以保持对齐).
其他分配也可能发生这种情况.内存分配器将至少分配您请求的内存,但通常只需要多一点.
这就是"只是一点点"的一部分,可以解决问题(除了使其变得困难的其他因素).因为我们不知道它是否有用.如果它只是填充,而你,recalloc它,并且分配器不会将它归零,那么你现在拥有一些非零的"新"内存.
例如,如果我recalloc foo让它指向一个至少2个字节大的新缓冲区怎么办?这个额外的字节是否会被清零?或不?它应该是,但请注意,原始分配给了我们8个字节,因此重新分配不会分配任何新内存.就分配器而言,它不需要将任何内存归零(因为没有"新"内存为零).这可能会导致我们的代码中出现严重错误.