首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C函数中有"nmem“和"size”参数的需要是什么?

在C函数中有"nmem“和"size”参数的需要是什么?
EN

Stack Overflow用户
提问于 2012-10-12 16:02:33
回答 2查看 524关注 0票数 8

可能重复: malloc与calloc之间的差异 为什么calloc需要两个参数而malloc只需要一个参数?

我注意到许多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‘。参数。

EN

回答 2

Stack Overflow用户

发布于 2012-10-12 18:15:51

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

但是,我确实发现calloc()alloc()同时出现,1975年5月发布了Unix V6。在11个月前发布的V5中,两个函数都没有出现;内核和运行时库(以及汇编程序和C编译器)都是在程序集中编写的。

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

代码语言:javascript
代码运行次数:0
运行
复制
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()出现
  • 在内存耗尽或堆错误的情况下,函数“返回空指针(0)”。
票数 2
EN

Stack Overflow用户

发布于 2012-10-12 16:28:41

有什么事情实际上发生在较低的级别,使得调用calloc(1,nmem*size)与calloc(nmem,size)有根本的不同吗?

这种解释事物的尝试完全依赖于libc实现,因此留给特定libc作者欣赏:

由于calloc()正在对内存进行零化,其基本原理可能是它在执行mult时可能(可能)会浪费更多的周期。

相反,malloc()有机会使用预先计算过的值,这可能会减少调用中的开销,从而使调用更容易满足。

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

这个问题也许可以由C丹尼斯里奇的作者更好地回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12862981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档