C - calloc的意义?

C里面有malloc和calloc,通常情况下大部分人使用的都是malloc,这两个的作用几乎就是等价的,但是为什么会有calloc这个东西呢?

其实这里面有几个要点:

错误与欺骗

auto m = malloc(INT_MAX * INT_MAX);

上面这个代码显而易见会报错提示说溢出了,而下面的calloc的操作将会返回无法分配内存,相比malloc更加安全

auto m = calloc(INT_MAX, INT_MAX)/;

通常在各种测试下,calloc都比malloc要快,

auto p = malloc(40000);
memset(p, 0, 40000);

auto p2 = calloc(1, 40000);

通常情况下p的速度都会比p2要慢,你说p进行了memset这是对p的分配到的不公平,其实也对,对p进行memset主要是不确定malloc出来的内存有没有被内存分配器全部设置为0,不然你也不想malloc给你的东西一开始就自带莫名其妙的黄色小说的内容吧。而calloc则不一样,他是一定会将整块内存区域设置为0的。

内核也在偷懒

同时你也要知道,一块内存被malloc/calloc分配了其实只是创建了一个虚拟内存的映射 并没有对应的物理内存,直到你去读写那块内存区域(按页来算),malloc之后进行memset为了确保内存分配器没有自动把内存设置为0的情况下将内存设置为0,但是这个操作真真切切的访问了/修改了内存,导致内存页从缺页状态切换为出现状态。而calloc也会设置为0,但是如果没有真真切切的访问,他并不会立即创建物理内存映射,因此往往速度就会更快。