Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Различия между функциями calloc и malloc

#c #функции #память #malloc #calloc


В чем заключается отличие функции malloc от calloc?
Есть ли случаи, когда подходит лишь одна из этих функций?
    


Ответы

Ответ 1



Во-первых, функция calloc, в отличие от malloc, возвращает указатель на инициализированный блок памяти, т.е. изначально содержащий нулевые биты1. Это, однако, совсем не означает, что функция calloc сама занимается обнулением полученного блока памяти в контексте пользовательского процесса. Функция calloc может пользоваться более эффективными средствами обнуления, предоставляемыми подлежащей платформой, т.е., например, выделять память в пуле "обнуленных страниц" ОС или использовать некий механизм "ленивого" обнуления уровня аппаратуры/ОС. То есть если вам нужен обнуленный блок памяти, то в общем случае получение такого блока памяти через calloc может оказаться существенно более эффективной операцией, чем "ручное" обнуление блока памяти, полученного через malloc. Во-вторых, функция calloc, как несложно заметить, сама внутренне занимается вычислением общего размера запрашиваемого блока памяти (буквально - перемножением своих аргументов). При этом функция calloc обязана самостоятельно отследить корректность такого перемножения, т.е. обнаружить ошибку при возникновении переполнения. В случае использования функции malloc такое перемножение (если оно необходимо) выполняет вызывающий код и предотвращение переполнения - обязанность вызывающего кода. 1 С точки зрения языка это не гарантирует правильное формирование нулевых указателей и нулевых значений плавающего типа.

Ответ 2



malloc просто выделяет память, оставляя ее содержимое неопределенным, a calloc ее гарантированно обнуляет. Что не всегда необходимо, зато требует времени...

Комментариев нет:

Отправить комментарий