2012-10-12 35 views
8

可能重复:
c difference between malloc and calloc
Why does calloc require two parameters and malloc just one?在C函数中需要具有“nmem”和“size”参数吗?

我与许多C函数注意到这个呼吁特别是那些与内存或文件操作处理,但不是所有的人同时使用参数。例如,malloc传递一个参数,即所需内存空间的大小(以字节为单位)。另一方面,Calloc传递两个参数,一个元素的字节大小和元素数量(大小和nmem)。还有其他函数也使用这些大小和nmem参数。

本质上释放calloc调用将分配相同的内存量调用malloc(NMEM 大小),这样所有的真实的情况是星号()被替换为逗号(,)。至少这是我从更高层面上可以看出我正在工作的一切。我没有看到与调用calloc(1,nmem 大小),calloc(nmem大小,1)或calloc(nmem,size)不同之处。

有什么实际的,使呼叫例如释放calloc一个较低的水平发生(1,NMEM *尺寸)释放calloc(NMEM,大小)根本不同?

编辑:我知道calloc和malloc之间的功能差异。我感兴趣的是为什么参数有差异。还有其他的功能,使用2个大小参数的总大小(fread,fwrite等)。我并不关心具体函数,而是为什么当函数中使用的总大小有两个参数时,实际上总大小成为两个参数的乘积。我发现大部分时间使用这些函数时,我在“size”参数中使用了我需要的大小,而在“nmem”参数中使用了“1”(有时是“count”等)参数。

+1

内存对齐是改善(上平台这两个参数表格。 – wallyk

+0

至于'malloc()'和'calloc()',你会发现一个互动的区别在这里解释:http://stackoverflow.com/a/1585987/694576 ... - 无论如何,你会介意我们指向其他函数,除了后两者,你还记得。 – alk

+2

@Paciv它不是重复的那个问题,它的答案没有解决参数数量的差异。 –

回答

0

是否有一些实际发生在较低级别的调用实例calloc(1,nmem * size)与calloc(nmem,size)根本不同的东西?

这种试图解释的东西是完全取决于从libc实现 - 并因此离开了在特定的libc作者的赞赏:

由于calloc()被归零内存,理由可能是,它可以(潜在地)浪费更多的周期来做mult

相比之下,malloc()有机会使用预先计算的值,可能会降低呼叫的开销,使其更容易满足。

不要忘了,下一次设计时,每个CPU周期花费了很多 - 因此一个很瘦的设计相比许多其他“更高级别的”语文。

C Dennis Ritchie的作者可能会更好地回答这个问题。

+0

Dennis Ritchie将不会很快回答问题,除非由ouija董事会... –

2

在对问题的评论,我写了calloc()允许地方事务的平台更好的内存对齐。我还没有找到任何支持(尚)的东西。我非常确定这是VMS/VAXC编译器的一个特性,但是它的源代码很少。


不过,我确实发现calloc()alloc()出现在同一时间,对Unix V6在1975年5月发布在V5,发布11个月较早,功能都不存在;内核和运行时库(以及汇编器和C编译器)都是用汇编语言编写的。

在V6释放,calloc is implemented作为四个线源代码模块:

calloc(n, s) 
{ 
return(alloc(n*s)); 
} 

calloc()不清除所分配的存储器;见alloc(),并且在V6中没有man页面calloc();然而man page for alloc()

说明
的Alloc自由提供一种简单的通用核心管理包。 Alloc给出了一个以字节为单位的大小;它返回一个指向至少大小为 的区域的指针,因此可以容纳任何类型的对象。 免费 的参数是指向先前由alloc分配的区域的指针;此空间可用于进一步分配。

不用说,将导致严重的疾病,如果由页头分配的空间 被侵占或者一些随机数是交给免费。

该例程使用了第一个拟合算法,该算法将已被释放的块与已释放的其他 块合并。它称为sbrk(见“break(II))” 当没有合适的空间已经空闲时从系统中获得更多内核。

DIAGNOSTICS
返回-1如果没有可用的核心。

BUGS
分配的内存包含垃圾,而不是被清除。

甚至在内存耗尽的情况下返回NULL

calloc()首次正式出现在UNIX V7,1979年1月,与其他几个improvements一起:

  • calloc()清除返回的内存。
  • alloc()被重命名为malloc()
  • realloc()出现
  • 在内存耗尽或堆错误的情况下,函数“返回空指针(0)”
+0

道歉,如果我错过了什么,但这是如何回答这个问题?我从代码中看到的一点是,calloc只是一个调用alloc的函数,但它会为你进行乘法运算。是这样的结论:它只是一个很好的或者它只是一个开发者编写的随机实现细节? – kurtzbot