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