2013-03-18 80 views
9

我想知道calloc()是否優於malloc,然後是memset。後者似乎是分配和初始化內存的最常見方式。使用calloc()而不是malloc()和memset()有什麼好處嗎?

A github code search變成了很多calloc測試和實現,但在第一頁的數量沒有代碼實際使用calloc

有誰知道任何項目/組織使用或推薦使用calloc和推薦它的情況?

從意見和下面的答案,這裏是一些有想法浮現至今:

  • calloc(n, size)可以防止溢出這是可能與malloc(n * size)

  • 結合的mallocmemset的calloc一個機會來請求一個已知已被歸零的頁面。

  • 一個缺點釋放calloc,該組合步驟可以排除周圍的malloc其他包裝。

+2

從來不知道任何人使用它,我從來沒有使用它,或者知道它的存在。我不知道爲什麼,但它只是不覺得像C. – Dave 2013-03-18 00:51:06

+5

請注意,'malloc()'後面跟'memset()'實際上保證比'calloc()'慢。 – 2013-03-18 00:58:50

+0

如果您在GitHub上搜索'malloc',您還可以在找到使用之前找到實現和測試代碼。 – 2013-03-18 01:03:19

回答

14

那麼,我使用calloc在相當多的C代碼,所以我想這是一個答案。我認爲稍微不尋常的調用方法(元素的數量和元素的大小)可能會引發人們的注意。但是,另一個原因可能導致您看不到多次調用,這是因爲很多大型項目都使用圍繞malloccalloc和朋友的內容,這些人在內存分配失敗時執行錯誤處理(通常會終止程序)。所以實際的代碼使用xcalloc來代替。

使用calloc超過malloc加上memset的一個原因是calloc可能更有效。如果C庫已經知道一個頁面被清零(也許它只是從操作系統獲得了新的歸零內存),那麼它不必顯式地將其歸零。

相關問題