calloc vs malloc (Принципиальное различие)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

calloc vs malloc

Сообщение BratSinot »

Доброго времени суток!

Есть ли принципиальное различие между calloc и malloc? Я почитал, что calloc еще все элементы инициализирует (обнуляет), теоритически получается что calloc меленнее malloc. А как на деле?
P.S. В основном интересует x86, amd64, но про другие архитектуры тоже интересно.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: calloc vs malloc

Сообщение NickLion »

На деле calloc медленнее malloc, но может быть быстрее, чем malloc+memset.

PS ах, да. malloc вообще не гарантирует, что память будет реально выделена (страницы памяти в смысле не будут выданы). memset или присваивания после этого выделит страницы. сфддщс же выделит страницы сразу.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: calloc vs malloc

Сообщение BratSinot »

NickLion писал(а):
21.05.2012 19:59
PS ах, да. malloc вообще не гарантирует, что память будет реально выделена (страницы памяти в смысле не будут выданы). memset или присваивания после этого выделит страницы. сфддщс же выделит страницы сразу.

А можнете напомнить что это?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

BratSinot писал(а):
21.05.2012 20:07
А можнете напомнить что это?
Очень просто: если malloc вернула NULL, значит память не выделена (не нашлось непрерывного куска адресного пространства подходящего размера). А вот если malloc вернула не NULL, то это совсем не означает, что память была на самом деле выделена и программа в один прекрасный момент не получит SIGSEGV при попытке записи в «выделенную» память. По причине так называемого overcommit.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: calloc vs malloc

Сообщение BratSinot »

watashiwa_daredeska писал(а):
21.05.2012 20:48
BratSinot писал(а):
21.05.2012 20:07
А можнете напомнить что это?
Очень просто: если malloc вернула NULL, значит память не выделена (не нашлось непрерывного куска адресного пространства подходящего размера). А вот если malloc вернула не NULL, то это совсем не означает, что память была на самом деле выделена и программа в один прекрасный момент не получит SIGSEGV при попытке записи в «выделенную» память. По причине так называемого overcommit.

Блин, а для чего тогда вообще malloc нужен?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

BratSinot писал(а):
21.05.2012 21:07
Блин, а для чего тогда вообще malloc нужен?
Чтоб память выделять. Не волнуйтесь, с calloc Вы получите ровно тот же SIGSEGV, но на этапе выделения памяти, а не чуть позже.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: calloc vs malloc

Сообщение Crazy »

BratSinot писал(а):
21.05.2012 21:07
Блин, а для чего тогда вообще malloc нужен?

зачем внутри плюсовых new использоваться calloc?

Desipere in loco
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 855
Статус: Оператор вычислительных машин
ОС: Debian

Re: calloc vs malloc

Сообщение Janik »

А как выделяют память на уровне ядра, в смысле, использую только системные вызовы?
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

Janik писал(а):
05.06.2012 09:28
как выделяют память на уровне ядра, в смысле, использую только системные вызовы?
Что имелось в виду: как выделяют на уровне ядра или какие вызовы ядра используются на уровне приложений?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: calloc vs malloc

Сообщение Portnov »

man 2 brk
?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 855
Статус: Оператор вычислительных машин
ОС: Debian

Re: calloc vs malloc

Сообщение Janik »

watashiwa_darede... писал(а):
05.06.2012 10:26
какие вызовы ядра используются на уровне приложений?

Они!
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

Janik писал(а):
05.06.2012 10:46
Они!
brk, mmap.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: calloc vs malloc

Сообщение drBatty »

BratSinot
а, блин, маны почитать слабо?

Код: Выделить всё

DESCRIPTION
       The  malloc() function allocates size bytes and returns a pointer to the allocated memory.  The memory is not initialized.  If size is
       0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

...
       The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to the  allocated  mem‐
       ory.   The  memory is set to zero.  If nmemb or size is 0, then calloc() returns either NULL, or a unique pointer value that can later
       be successfully passed to free().

что тут непонятного? malloc(3) не инициализирует память, calloc(3) инициализирует нулями.
watashiwa_darede... писал(а):
21.05.2012 20:48
А вот если malloc вернула не NULL, то это совсем не означает, что память была на самом деле выделена и программа в один прекрасный момент не получит SIGSEGV

да? т.е. _гарантировано_ calloc(3) сначала проверяет наличие куска, а уж потом его нулями забивает? И с ней SIGSEGV _гарантированно_ не будет?
А мне кажется, что разницы никакой тут нету, и эта ваша "проверка" - только вредна обычно. Если программе суждено рухнуть - она таки рухнет, ведь никого не волнует, есть-ли нужная память в момент её выделения, дорога ложка к обеду. Вполне возможно, что памяти в момент выделения нет, но потом она появится (например мы освободим другой (теперь) ненужный кусок), тогда ваша calloc таки рухнет, а вот версия с malloc будет прекрасно работать.

Ну а проверять надо не такими средствами, а переменными окружения MALLOC_CHECK_

Код: Выделить всё

       Recent  versions  of Linux libc (later than 5.4.23) and glibc (2.x) include a malloc() implementation which is tunable via environment
       variables.  When MALLOC_CHECK_ is set, a special (less efficient) implementation is used which is designed to be tolerant against sim‐
       ple  errors,  such  as  double  calls  of free() with the same argument, or overruns of a single byte (off-by-one bugs).  Not all such
       errors can be protected against, however, and memory leaks can result.  If MALLOC_CHECK_ is set to 0, any detected heap corruption  is
       silently  ignored; if set to 1, a diagnostic message is printed on stderr; if set to 2, abort(3) is called immediately; if set to 3, a
       diagnostic message is printed on stderr and the program is aborted.  Using a nonzero MALLOC_CHECK_ value can be useful because  other‐
       wise a crash may happen much later, and the true cause for the problem is then very hard to track down.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

drBatty писал(а):
05.06.2012 13:07
Ну а проверять надо не такими средствами, а переменными окружения MALLOC_CHECK_
drBatty писал(а):
05.06.2012 13:07
When MALLOC_CHECK_ is set, a special (less efficient) implementation is used
Лесом. В пешее путешествие. Не говоря уже о том, что MALLOC_CHECK_ вообще не об этом.

drBatty писал(а):
05.06.2012 13:07
И с ней SIGSEGV _гарантированно_ не будет?
«В один прекрасный момент» — не будет. Будет в самом calloc. См. calloc vs malloc

drBatty писал(а):
05.06.2012 13:07
эта ваша "проверка" - только вредна обычно
А вот тут потрудитесь привести аргументы. Хотя, не надо — знаю я Ваши «аргументы». Один из них выше — опять не те буквы прочитали про MALLOC_CHECK_, а теперь будете доказывать, что написано там не то, что написано на самом деле. Нафиг-нафиг.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: calloc vs malloc

Сообщение drBatty »

watashiwa_darede... писал(а):
05.06.2012 14:54
Лесом. В пешее путешествие.

зря вы так. Конечно, проверять, а потом занимать, с оглядкой менее эффективно, это же Кэп! Лучше тупо загробастать всё, наплевав на злобный OOM Killer, который всегда неусыпно бдит.
watashiwa_darede... писал(а):
05.06.2012 14:54
Не говоря уже о том, что MALLOC_CHECK_ вообще не об этом.

ну вот сейчас, мне, неразумному, всё и объяснят. Жду...
watashiwa_darede... писал(а):
05.06.2012 14:54
«В один прекрасный момент» — не будет. Будет в самом calloc.

ну и что? будет в момент заполнения памяти. Так? Память во время выполнения calloc нужна? В общем случае - нет. Значит юзать calloc надо тогда, когда известно _точно_, что память будет нужна _вся_ и _прямо_ _сейчас_. Если такой уверенности нет, то очевидно, юзаем malloc, которая не забивает память, память займём (если займём) мы сами, и именно тогда, когда она будет нужна.
Ну и если всё так уж плохо, кто мешает нам построить свой распределитель?
watashiwa_darede... писал(а):
05.06.2012 14:54
А вот тут потрудитесь привести аргументы. Хотя, не надо — знаю я Ваши «аргументы».

аргументы были. Они тут просты как 3 копейки: нам нужна страница? Мы берём страницу. Смысл занимать её тогда, когда она нам не нужна? Для проверки того, что она "доступна"? Ну допустим доступна, и что дальше? Будет так висеть и занимать место? А вы вообще уверены в том, что эта страница нам понадобиться? Да? Любой алгоритм распределения памяти подразумевает наличия множества неиспользуемых дыр, так зачем их использовать лишний раз?
ИМХО это полезно _только_ для отладки, когда мы берём наихудший случай, с самого начала: если отхватили 9001 страницу, так и заюзали все эти отхваченные страницы, причём сразу. Но зачем делать худший случай правилом, кроме как для тестирования - мне непонятно.
watashiwa_darede... писал(а):
05.06.2012 14:54
Один из них выше — опять не те буквы прочитали про MALLOC_CHECK_, а теперь будете доказывать, что написано там не то, что написано на самом деле. Нафиг-нафиг.

1, причём тут буквы? я вообще не о том.
2. ну если вы таки постигли дао MALLOC_CHECK_, то потрудитесь довести его до всех, ибо лично я этим как-то не озадачивался особо. Да и не претендую на Высшее Знание.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

drBatty писал(а):
05.06.2012 17:18
лично я этим как-то не озадачивался особо
Тогда не пишите всякую ересь о том, чем не озадачивались.

drBatty писал(а):
05.06.2012 17:18
ну вот сейчас, мне, неразумному, всё и объяснят. Жду...
Объяснение — в том документе, откуда Вы сами же и процитировали. Неумение читать — не моя проблема.

drBatty писал(а):
05.06.2012 17:18
нам нужна страница? Мы берём страницу. Смысл занимать её тогда, когда она нам не нужна?
При чем тут «занимать страницу»? Речь шла о проверке возвращаемого malloc() значения на NULL.
Spoiler
Это уже больше смахивает на хронический троллизм и недержание темы.


drBatty писал(а):
05.06.2012 17:18
потрудитесь довести его до всех
Хорошо, т.к. Вы не потрудились указать источники своей цитаты, я это сделаю за Вас: man 3 malloc, https://www.gnu.org/software/libc/manual/ht...y-Checking.html Еще полезно может быть man 3 mallopt
Надеюсь те, кому надо, читать умеют.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: calloc vs malloc

Сообщение drBatty »

watashiwa_darede... писал(а):
05.06.2012 17:48
Тогда не пишите всякую ересь о том, чем не озадачивались.

тогда опровергните эту "ересь". А то вы таки просто обозвали, а фактов - нету.
watashiwa_darede... писал(а):
05.06.2012 17:48
Объяснение — в том документе, откуда Вы сами же и процитировали. Неумение читать — не моя проблема.

т.е. вы сами там ничего не поняли, но осуждаете?
watashiwa_darede... писал(а):
05.06.2012 17:48
При чем тут «занимать страницу»? Речь шла о проверке возвращаемого malloc() значения на NULL.

ну и?

watashiwa_darede... писал(а):
05.06.2012 17:48
Хорошо, т.к. Вы не потрудились указать источники своей цитаты

читать разучились?
drBatty писал(а):
05.06.2012 13:07
а, блин, маны почитать слабо?

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: calloc vs malloc

Сообщение watashiwa_daredeska »

drBatty писал(а):
06.06.2012 11:25
тогда опровергните эту "ересь"
Вы хотите, чтобы я маны пересказал на русском языке для 3-го класса школы? $5/слово.

drBatty писал(а):
06.06.2012 11:25
т.е. вы сами там ничего не поняли, но осуждаете?
Я-то понял, а вот Вы поняли? Объяснять лично Вам мне не интересно. Ссылки на документы есть, кому надо — прочитают сами.

watashiwa_darede... писал(а):
21.05.2012 20:48
А вот если malloc вернула не NULL
drBatty писал(а):
05.06.2012 13:07
А мне кажется, что разницы никакой тут нету, и эта ваша "проверка" - только вредна обычно.
watashiwa_darede... писал(а):
05.06.2012 17:48
При чем тут «занимать страницу»? Речь шла о проверке возвращаемого malloc() значения на NULL.
drBatty писал(а):
06.06.2012 11:25
ну и?
Ну и?

drBatty писал(а):
06.06.2012 11:25
читать разучились?
drBatty писал(а):
05.06.2012 13:07
а, блин, маны почитать слабо?

Это просто прекрасно! Для начала замечу, что источник цитирования принято указывать для каждой цитаты где-нибудь рядом с ней в тексте (так, чтобы было понятно, что именно это —- источник цитаты), либо отдельно выделять, а не вуалировать в виде предложения в стиле «брать на понт» в самом начале поста, для цитаты в самом его конце. Кроме того, указывать источник цитирования «маны» — примерно то же самое, что и указание источника «Российская государственная библиотека» или «Библиотека Конгресса». В мире как-то принято несколько точнее указывать, XXI век все-таки, даже координаты на планете с точностью до метров определять уже может потенциально каждый.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: calloc vs malloc

Сообщение BratSinot »

watashiwa_daredeska писал(а):
05.06.2012 17:48
drBatty писал(а):
05.06.2012 17:18
потрудитесь довести его до всех
Хорошо, т.к. Вы не потрудились указать источники своей цитаты, я это сделаю за Вас: man 3 malloc, https://www.gnu.org/software/libc/manual/ht...y-Checking.html Еще полезно может быть man 3 mallopt
Надеюсь те, кому надо, читать умеют.


This function is a GNU extension, declared in mcheck.h.

Нифига не круто.

Да и потом, изначально тема было про разницу между calloc и malloc.
Спасибо сказали: