为什么没有" recalloc"在C标准?

时间:2015-02-12 20:49:25

标签: c malloc allocation realloc calloc

每个人都知道:

  • realloc调整现有内存块的大小或将其复制到更大的块中。
  • calloc确保内存被清零并防止算术溢出,并且通常面向大型数组。

为什么C标准没有提供如下结合上述两者的功能?

void *recalloc(void *ptr, size_t num, size_t size);

调整大型哈希表或自定义内存池的大小不会有用吗?

2 个答案:

答案 0 :(得分:15)

通常在C中,标准库的要点是,以提供丰富的酷函数。它提供了一组必要的构建块,您可以从中构建自己的酷函数。

你对recalloc的提议写起来很简单,因此不是标准的lib应该提供的。

其他语言采用不同的方法:C#和Java具有超级丰富的库,甚至使复杂的任务变得微不足道。但它们带来了巨大的开销。 C具有最小的开销,有助于使其可移植到各种嵌入式设备。

答案 1 :(得分:6)

我认为你只对将数组的新部分归零感兴趣:

并非每个内存分配器都知道您在阵列中使用了多少内存。例如,如果我这样做:

char* foo = malloc(1);

foo现在指向至少一块1字节大的内存。但是大多数分配器将分配超过1个字节(例如,8,以保持对齐)。

其他分配也可能发生这种情况。内存分配器将为您分配至少尽可能多的内存,但通常只需多一点。

正是这个“只是更多一点”的部分搞砸了(除了使其变得困难的其他因素)。因为我们不知道它是否有用。如果它只是填充,并且你recalloc它,并且分配器没有将它归零,那么你现在拥有一些非零的“新”内存。

例如,如果我recalloc foo将其指向一个至少大2字节的新缓冲区,该怎么办?这个额外的字节是否会被清零?或不?它应该是,但请注意,原始分配给了我们8个字节,因此重新分配不会分配任何新内存。就分配器而言,它不需要将任何内存归零(因为没有“新”内存为零)。这可能会导致我们的代码中出现严重错误。