做的有什么区别:
ptr = (char **) malloc (MAXELEMS * sizeof(char *));
Run Code Online (Sandbox Code Playgroud)
要么:
ptr = (char **) calloc (MAXELEMS, sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
什么时候使用calloc而不是malloc是一个好主意,反之亦然?
众所周知,它与初始化分配的内存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++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码1的输出:
time ./a.out
**real 0m0.287s**
user 0m0.095s
sys 0m0.192s
Run Code Online (Sandbox Code Playgroud)
代码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++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2的输出:
time ./a.out
**real 0m2.693s**
user 0m0.973s
sys 0m1.721s
Run Code Online (Sandbox Code Playgroud)
更换 …
有很多资源描述了malloc
和之间的功能差异calloc
,但我不能轻易找到描述不同功能签名背后的历史的资源:
void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
Run Code Online (Sandbox Code Playgroud)
当然,size
前者是每个成员的大小.也许这个想法是可以通过操作系统懒散地完成多页面大小的成员大小的calloc?
(我可以弥补原因以及下一个人 - 没有引用来源没有接受的答案.:-)
我目前正在C中编写嵌入式应用程序,其中性能至关重要.
目前,我正在分配大量的空内存,如下所示:calloc(1, num_bytes)
- 但是,我只是计算num_bytes
了许多项目的产品和代码中较早的每个项目的大小,因为它是以前调用的代码malloc
.
calloc
看起来很独特,因为它是-alloc系列的唯一内存分配函数,它为大小提供了两个参数.有这么好的理由吗?是否存在对指定不同参数的性能影响?选择这种参数布局的理由是什么?