两者之间有什么区别:
ptr = (char **) malloc (MAXELEMS * sizeof(char *));
要么:
ptr = (char **) calloc (MAXELEMS, sizeof(char*));
什么时候在malloc上使用calloc是个好主意,反之亦然?
calloc()
给您一个零初始化的缓冲区,而未初始化malloc()
的内存。
对于较大的分配,calloc
主流操作系统下的大多数实现都将从操作系统(例如,通过POSIXmmap(MAP_ANONYMOUS)
或Windows VirtualAlloc
)获得已知为零的页面,因此无需在用户空间中写入它们。这也是正常情况下malloc
从操作系统获取更多页面的方式。calloc
只是利用了操作系统的保证。
这意味着calloc
内存仍然可以是“干净的”和延迟分配的,并且写时复制映射到系统范围的零共享物理页。(假定系统具有虚拟内存。)
有些编译器甚至可以为您优化malloc + memset(0)到calloc中,但是如果您希望将内存读取为,则应该显式使用calloc 0
。
如果您不打算在写入之前读取内存,请使用它,malloc
以便(可能)从其内部空闲列表中为您提供脏内存,而不是从操作系统中获取新页面。(或者不是将空闲列表上的内存块清零以进行少量分配)。
如果没有操作系统,或者不是花哨的多用户操作系统将页面清零以阻止进程之间的信息泄漏,则的嵌入式实现calloc
可能会将其calloc
自身留给零内存。
在嵌入式Linux上,malloc可以mmap(MAP_UNINITIALIZED|MAP_ANONYMOUS)
启用,仅对某些嵌入式内核启用,因为它在多用户系统上不安全。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句