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