在C函数中使用“nmem”和“size”参数需要什么?

可能重复:
malloc和calloc之间的区别
为什么calloc需要两个参数而malloc只有一个?

我注意到许多C函数调用,尤其是那些处理内存或文件操作的函数,但并不是所有的函数都使用这两个参数。 例如,malloc传递一个参数,即所需内存空间的大小。 另一方面,Calloc传递两个参数,一个元素的大小和元素的数量(size和nmem)。 还有其他的函数使用这些大小和nmem参数。

本质上,calloc调用将分配与调用malloc(nmem 大小)相同的内存量, 所以真正发生的情况是用逗号(,)replaceasterisk( )。 至less这是我从上级那里可以看出我正在工作的。 我看不到调用calloc(1,nmem size),calloc(nmem size,1)或calloc(nmem,size)的区别。

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

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

在对这个问题的评论中,我写道, calloc()允许更好的内存对齐的平台重要。 我还没有找到任何支持(还)的东西。 我非常确定这是VMS / VAXC编译器的一个特性,但是对于这个编译器来说,这个编译器是很少的。


但是,我发现calloc()alloc()出现,1975年5月发布了Unix V6。在11个月前发布的V5中,这两个函数都不存在。 内核和运行时库(以及汇编器和C编译器)都是用汇编语言编写的。

在V6发行版中, calloc被实现为四行源代码模块:

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

calloc()不清除已分配的内存; 请参阅alloc() ,并且在V6中没有calloc() man页; 不过alloc()的手册页 :

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

不用说,如果alloc分配的空间超限,或者一些随机数字被释放 ,将导致严重的混乱

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

诊断
如果没有可用的内核,则返回-1

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

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

calloc()第一次正式出现在1979年1月的UNIX V7中,同时还有其他一些改进 :

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

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

这个解释事物的尝试完全依赖于libc实现 – 因此留在了特定libc作者的赞赏之中:

由于calloc()正在调零内存,原因可能是它可能会(潜在地)浪费更多的周期来进行mult

相比之下, malloc()则有机会使用一个预先计算的值,可能会减少一个更容易满足的调用的开销。

不要忘记,C是在每个CPU周期花费很多的时候设计的,因此与许多其他“高级”语言相比,它是一个非常精简的设计。

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