Когда я должен использовать Calloc над Malloc - PullRequest
9 голосов
/ 12 ноября 2011

Это из руководства Биджа к C "Недостаток использования calloc () состоит в том, что для очистки памяти требуется время, и в большинстве случаев вам не нужно очищать его, так как вы все равно просто будете переписывать его. Но если вы когда-нибудь обнаружите, что malloc () Сразу после того, как вы установили блок, а затем обнулили память, вы можете использовать calloc (), чтобы сделать это за один вызов. "

так, каков потенциальный сценарий, когда я захочу очистить память до нуля.

Ответы [ 5 ]

9 голосов
/ 12 ноября 2011

Когда функция передает буфер в состояние, содержащееся в его документации, буфер должен быть заполнен нулями. Вы также можете всегда обнулять память для безопасности; на самом деле это не займет так много времени, если буферы не будут действительно огромными. Распределение памяти само по себе является потенциально дорогостоящей частью операции.

6 голосов
/ 12 ноября 2011

В одном сценарии вы выделяете массив целых чисел (скажем, как аккумуляторы или переменные счетчика), и вы хотите, чтобы каждый элемент в массиве начинался с 0.

2 голосов
/ 12 ноября 2011

В некоторых случаях, когда вы выделяете память для некоторой структуры, и некоторые члены этой структуры могут перейти к вычислению в некотором выражении или в условном выражении без инициализации этой структуры в этомВ случае, если это будет вредно или даст вам неопределенное поведение.Так что лучше преодолеть эту проблему вы

1> malloc that structure and memset it with 0 before using that structure 

или

2> calloc that structure  

Примечание: некоторые современные программы управления памятью с помощью malloc также сбрасывают память с 0

0 голосов
/ 12 ноября 2011

Если вся выделенная память заполнена нулями, поведение программы гораздо более воспроизводимо (поэтому, скорее всего, поведение будет таким же, если вы перезапустите свою программу). Вот почему я не использую неинициализированные зоны malloc.

(по аналогичным причинам при отладке программ на C или C ++ в Linux я обычно выполняю echo 0 > /proc/sys/kernel/randomize_va_space, чтобы поведение mmap было более воспроизводимым).

И если ваша программа не выделяет огромные блоки (то есть десятки мегабайт), время, проведенное внутри malloc, намного больше, чем время для его обнуления.

0 голосов
/ 12 ноября 2011

Существует множество случаев, когда вы можете захотеть обнулить память!

Некоторые примеры:

  • Выделение памяти для размещения структуры, в которой вы хотите, чтобы все элементы были инициализированы нулем
  • Выделение памяти для массива символов, в который вы позже будете записывать некоторое количество символов, а затем обрабатывать его как NULL-завершенную строку
  • Выделение памяти для массива указателей, которые вы хотите инициализироватьв NULL
...