什么时候应该使用callc而不是malloc



这是来自Beej的C指南"使用calloc()的缺点是它需要时间来清除内存,而且在大多数情况下,您不需要清除内存,因为无论如何都要对其进行写入。但是,如果您发现自己使用malloc()调用一个块,然后将内存设置为零,则可以使用calloc()在一次调用中完成此操作。"

那么当我想要将内存清除为零时,可能会出现什么情况

传递缓冲区的函数在文档中声明缓冲区必须为零填充时。为了安全起见,你也可以随时将记忆归零;它实际上不会花费太多时间,除非缓冲区非常大。内存分配本身是操作中潜在的开销较大的部分。

一种情况是,您正在分配一个整数数组(例如,作为累加器或计数器变量),并且您希望数组中的每个元素都从0开始。

在某些情况下,当您为某个结构分配内存时,该结构的某些成员可能会在中计算某些表达式条件语句,而不初始化该结构,在这种情况下,这将是有害的或会给您未定义的行为。所以克服这一切,你会更好

1> malloc that structure and memset it with 0 before using that structure 

2> calloc that structure  

注意:一些带有malloc的高级内存管理程序也会将内存重置为0

很多时候您可能希望内存归零!

一些例子:

  • 分配内存来包含一个结构,在这个结构中你想要所有的初始化为零的成员
  • 为字符数组分配内存,您稍后将向其中写入一些字符,然后将其视为NULL结尾字符串
  • 为你想初始化为NULL的指针数组分配内存

如果所有分配的内存都是零填充的,则程序的行为更容易重现(因此如果重新运行程序,行为更可能相同)。这就是为什么我不使用未初始化的malloc区域。

(出于类似的原因,在Linux上调试C或c++程序时,我通常使用echo 0 > /proc/sys/kernel/randomize_va_space,以便mmap的行为更容易重现)。

如果你的程序没有分配巨大的块(例如几十兆字节),在malloc内花费的时间要比将其归零的时间大得多。

最新更新