众所周知calloc
与malloc
的不同之处在于它初始化分配的内存。使用calloc
时,内存设置为零。使用malloc
时,内存不会被清除。
因此,在日常工作中,我将calloc
视为malloc
+ memset
。
顺便说一句,为了好玩,我为基准编写了以下代码。
结果令人困惑。
代码1:
#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)calloc(1,BLOCK_SIZE);
i++;
}
}
代码1的输出:
time ./a.out
**real 0m0.287s**
user 0m0.095s
sys 0m0.192s
代码2:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)malloc(BLOCK_SIZE);
memset(buf[i],'\0',BLOCK_SIZE);
i++;
}
}
代码2的输出:
time ./a.out
**real 0m2.693s**
user 0m0.973s
sys 0m1.721s
在代码2中用memset
替换bzero(buf[i],BLOCK_SIZE)
会产生相同的结果。
我的问题是:为什么malloc
+ memset
比calloc
慢得多? calloc
如何做到这一点?
答案 0 :(得分:428)
答案 1 :(得分:12)
因为在许多系统上,在备用处理时间内,操作系统会自行将可用内存设置为零并标记为calloc()
安全,因此当您调用calloc()
时,它可能已经有给你的免费,归零记忆。
答案 2 :(得分:1)
在某些模式的某些平台上,malloc在返回之前将内存初始化为某些通常为非零的值,因此第二个版本可以很好地初始化内存两次