Мне было интересно, предпочтительнее ли calloc()
, чем malloc
, за которым следует memset
. Последний представляется наиболее распространенным способом выделения и инициализации памяти.
поиск по коду github выдает множество calloc
тестов и реализаций, но на первых страницах на самом деле нет кода, использующего calloc
.
Кто-нибудь знает о каких-либо проектах/организациях, которые используют или рекомендуют использовать calloc
, и при каких обстоятельствах это рекомендуется?
Из комментариев и ответов ниже, вот некоторые мысли, которые возникли до сих пор:
calloc(n, size)
может предотвратить переполнение, которое возможно сmalloc(n * size)
сочетание malloc и memset дает calloc возможность запросить страницу, которая, как известно, уже обнулена.
недостатком calloc является то, что объединенные шаги могут помешать другим оболочкам вокруг malloc.
malloc()
, за которым следуетmemset()
, практически гарантированно будет медленнее, чемcalloc()
. - person Dietrich Epp   schedule 18.03.2013malloc
, вы также найдете реализации и тестовый код, прежде чем найдете применение. - person Dietrich Epp   schedule 18.03.2013malloc/memset
vscalloc
: я был бы удивлен, если бы в этом была правда при использовании оптимизирующего компилятора. Можете ли вы указать причину или показать ориентир? Все, о чем я могу думать, это лучшее кэширование, но malloc вообще не проходит через память. - person Dave   schedule 18.03.2013malloc()
на второй странице. И я уверен, чтоcalloc()
встречается реже, точно так же, как деление встречается реже, чем умножение, но вы не видите, чтобы люди спрашивали, почему мы не можем от него избавиться. - person Dietrich Epp   schedule 18.03.2013malloc(num * size)
иcalloc(num, size)
ведут себя по-разному для больших чисел. Для получения дополнительной информации см. Ray Статья Лая Undeadly о целочисленных переполнениях. Также из-за этого OpenBSD создалаreallocarray
. - person Cristian Ciupitu   schedule 08.08.2015