1. 程式人生 > >C語言中到底是應該用malloc+memset,還是用calloc

C語言中到底是應該用malloc+memset,還是用calloc

有一些老的博文裡會推薦別人用malloc+memset來開闢記憶體和初始化,認為calloc效率更低。

如果是單純的malloc和calloc的比較,毋庸置疑,calloc肯定是效率更低的,畢竟calloc多做了一步記憶體的初始化。

但是malloc+memset和calloc的比較,效率差別其實是非常非常小的。以下是我在Windows環境的測試程式碼:

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>

#include <Windows.h>

#define BUF_SIZE       10240
#define LOOP_COUNT     1000000

static void _test_malloc()
{
    char *data = NULL;
    int i = 0;

    for (i = 0; i < LOOP_COUNT; ++i) {
        data = (char *)malloc(BUF_SIZE);
        memset(data, 0, BUF_SIZE);
        free(data);
    }
}

static void _test_calloc()
{
    char *data = NULL;
    int i = 0;

    for (i = 0; i < LOOP_COUNT; ++i) {
        data = (char *)calloc(BUF_SIZE, sizeof(char));
        free(data);
    }
}

int main(int argc, char *argv[])
{
    clock_t start = { 0 };
    clock_t finish = { 0 };

    start = clock();
    _test_malloc();
    finish = clock();
    printf("%d malloc cost:%dms\n", LOOP_COUNT, finish - start);

    start = clock();
    _test_calloc();
    finish = clock();
    printf("%d calloc cost:%dms\n", LOOP_COUNT, finish - start);

    getchar();
    return 0;
}

每次分配10K記憶體,分別迴圈100萬次,效率上的差別基本上還是毫秒級別的。測試程式碼不太嚴謹,但是應該不影響結論。

所以個人認為:除非是非常確定不需要初始化記憶體的場景,否則我覺得還是用calloc替代malloc+memset比較好,避免忘記初始化記憶體(也省一行程式碼^_^