小编典典

malloc 和 calloc 的区别?

all

做有什么区别:

ptr = malloc (MAXELEMS * sizeof(char *));

要么:

ptr = calloc (MAXELEMS, sizeof(char*));

什么时候使用 calloc 而不是 malloc 是个好主意,反之亦然?


阅读 284

收藏
2022-03-01

共1个答案

小编典典

calloc()为您提供一个零初始化的缓冲区,malloc()而使内存未初始化。

对于大分配,主流操作系统下的大多数实现都会从操作系统(例如通过 POSIX或 Windows
calloc获得已知零页面,因此它不需要在用户空间中编写它们。这也是正常从操作系统获取更多页面的方式;只是利用操作系统的保证。mmap(MAP_ANONYMOUS)``VirtualAlloc``malloc``calloc

这意味着calloc内存仍然可以是“干净的”和延迟分配的,并且写入时复制映射到系统范围的共享零物理页。(假设系统具有虚拟内存。)

一些编译器甚至可以为您优化 malloc + memset(0) 为 calloc,但如果您希望内存读取为0.

如果您在写入之前不打算读取内存,请使用malloc它以便(可能)从其内部空闲列表中为您提供脏内存,而不是从操作系统获取新页面。(或者不是将空闲列表上的一块内存归零以进行少量分配)。


如果没有操作系统,嵌入式实现calloc可能会将其自身保持为零内存,或者它不是一个花哨的多用户操作系统,它会将页面归零以阻止进程之间的信息泄漏。calloc

在嵌入式 Linux 上, malloc
可以mmap(MAP_UNINITIALIZED|MAP_ANONYMOUS),它仅对某些嵌入式内核启用,因为它在多用户系统上不安全。

2022-03-01