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,但是如果没有真真切切的访问,他并不会立即创建物理内存映射,因此往往速度就会更快。