我注意到许多C函数调用,特别是那些处理内存或文件操作的调用,但并不是所有函数都使用这两个参数。例如,malloc被传递给一个参数,即所需内存空间的字节大小。另一方面,向Calloc传递两个参数,即元素的字节大小和元素的数量(size和nmem)。还有其他函数也使用这些大小和nmem参数。
基本上,calloc调用将分配与调用malloc(nmemsize)相同的内存,所以真正发生的事情就是用逗号(,)替换星号()。至少这是我从更高层次的工作中所能知道的全部。我看不出调用calloc(1,nmem_size)、calloc(nmem_size,1)或calloc(nmem,size)有什么不同。
有什么事情实际上发生在较低的级别,使得调用calloc(1,nmem*size)与calloc(nmem,size)有根本的不同吗?
编辑:我知道calloc和malloc之间的功能区别。我感兴趣的是为什么参数有差异。还有其他函数使用2个大小参数来表示总大小(fread、fwrite等)。我不关心具体的函数,而是为什么函数中使用两个参数来表示总大小,而实际上,当总大小变成两个参数相乘时。我发现大多数时候,当我使用这些函数时,我使用" size“参数中所需的大小,对于"nmem”(有时是"count“等)使用'1‘。参数。
发布于 2012-10-12 18:15:51
在对这个问题的评论中,我写道,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分配的区域的指针;此空间可供进一步分配。 不用说,如果分配给分配的空间被超出,或者一些随机数被传递给自由,那么就会产生严重的混乱。 该例程使用了一种先匹配算法,将已释放的块与已经释放的其他块合并起来。它调用sbrk (请参阅"break (II)“),以便在没有合适的空闲空间时从系统中获得更多的核心。 诊断 如果没有可用的核心,则返回-1。 臭虫 分配的内存包含垃圾,而不是被清除。
在内存耗尽的情况下,甚至不返回NULL
!
1979年1月,calloc()
和其他几个改进一起正式出现在UNIX V7中。
calloc()
清除返回的内存。alloc()
被重命名为malloc()
realloc()
出现发布于 2012-10-12 16:28:41
有什么事情实际上发生在较低的级别,使得调用calloc(1,nmem*size)与calloc(nmem,size)有根本的不同吗?
这种解释事物的尝试完全依赖于libc实现,因此留给特定libc作者欣赏:
由于calloc()
正在对内存进行零化,其基本原理可能是它在执行mult
时可能(可能)会浪费更多的周期。
相反,malloc()
有机会使用预先计算过的值,这可能会减少调用中的开销,从而使调用更容易满足。
不要忘记,C是在每个CPU周期花费很多的时候设计的,因此与许多其他“高级”语言相比,设计非常精益。
这个问题也许可以由C丹尼斯里奇的作者更好地回答。
https://stackoverflow.com/questions/12862981
复制相似问题