C語言中到底是應該用malloc+memset,還是用calloc
阿新 • • 發佈:2019-01-27
有一些老的博文裡會推薦別人用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比較好,避免忘記初始化記憶體(也省一行程式碼^_^