calloc vs malloc (Принципиальное различие)
Модератор: Модераторы разделов
-
- Сообщения: 812
- ОС: Slackware64
calloc vs malloc
Доброго времени суток!
Есть ли принципиальное различие между calloc и malloc? Я почитал, что calloc еще все элементы инициализирует (обнуляет), теоритически получается что calloc меленнее malloc. А как на деле?
P.S. В основном интересует x86, amd64, но про другие архитектуры тоже интересно.
Есть ли принципиальное различие между calloc и malloc? Я почитал, что calloc еще все элементы инициализирует (обнуляет), теоритически получается что calloc меленнее malloc. А как на деле?
P.S. В основном интересует x86, amd64, но про другие архитектуры тоже интересно.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: calloc vs malloc
На деле calloc медленнее malloc, но может быть быстрее, чем malloc+memset.
PS ах, да. malloc вообще не гарантирует, что память будет реально выделена (страницы памяти в смысле не будут выданы). memset или присваивания после этого выделит страницы. сфддщс же выделит страницы сразу.
PS ах, да. malloc вообще не гарантирует, что память будет реально выделена (страницы памяти в смысле не будут выданы). memset или присваивания после этого выделит страницы. сфддщс же выделит страницы сразу.
-
- Сообщения: 812
- ОС: Slackware64
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Очень просто: если malloc вернула NULL, значит память не выделена (не нашлось непрерывного куска адресного пространства подходящего размера). А вот если malloc вернула не NULL, то это совсем не означает, что память была на самом деле выделена и программа в один прекрасный момент не получит SIGSEGV при попытке записи в «выделенную» память. По причине так называемого overcommit.
Мои розовые очки
-
- Сообщения: 812
- ОС: Slackware64
Re: calloc vs malloc
watashiwa_daredeska писал(а): ↑21.05.2012 20:48Очень просто: если malloc вернула NULL, значит память не выделена (не нашлось непрерывного куска адресного пространства подходящего размера). А вот если malloc вернула не NULL, то это совсем не означает, что память была на самом деле выделена и программа в один прекрасный момент не получит SIGSEGV при попытке записи в «выделенную» память. По причине так называемого overcommit.
Блин, а для чего тогда вообще malloc нужен?
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Чтоб память выделять. Не волнуйтесь, с calloc Вы получите ровно тот же SIGSEGV, но на этапе выделения памяти, а не чуть позже.
Мои розовые очки
-
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
-
- Сообщения: 855
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: calloc vs malloc
А как выделяют память на уровне ядра, в смысле, использую только системные вызовы?
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Что имелось в виду: как выделяют на уровне ядра или какие вызовы ядра используются на уровне приложений?
Мои розовые очки
-
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: calloc vs malloc
man 2 brk
?
?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
- Сообщения: 855
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: calloc vs malloc
Они!
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: calloc vs malloc
BratSinot
а, блин, маны почитать слабо?
что тут непонятного? malloc(3) не инициализирует память, calloc(3) инициализирует нулями.
да? т.е. _гарантировано_ calloc(3) сначала проверяет наличие куска, а уж потом его нулями забивает? И с ней SIGSEGV _гарантированно_ не будет?
А мне кажется, что разницы никакой тут нету, и эта ваша "проверка" - только вредна обычно. Если программе суждено рухнуть - она таки рухнет, ведь никого не волнует, есть-ли нужная память в момент её выделения, дорога ложка к обеду. Вполне возможно, что памяти в момент выделения нет, но потом она появится (например мы освободим другой (теперь) ненужный кусок), тогда ваша calloc таки рухнет, а вот версия с malloc будет прекрасно работать.
Ну а проверять надо не такими средствами, а переменными окружения MALLOC_CHECK_
а, блин, маны почитать слабо?
Код: Выделить всё
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.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Лесом. В пешее путешествие. Не говоря уже о том, что MALLOC_CHECK_ вообще не об этом.
«В один прекрасный момент» — не будет. Будет в самом calloc. См. calloc vs malloc
А вот тут потрудитесь привести аргументы. Хотя, не надо — знаю я Ваши «аргументы». Один из них выше — опять не те буквы прочитали про MALLOC_CHECK_, а теперь будете доказывать, что написано там не то, что написано на самом деле. Нафиг-нафиг.
Мои розовые очки
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: calloc vs malloc
зря вы так. Конечно, проверять, а потом занимать, с оглядкой менее эффективно, это же Кэп! Лучше тупо загробастать всё, наплевав на злобный 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_, то потрудитесь довести его до всех, ибо лично я этим как-то не озадачивался особо. Да и не претендую на Высшее Знание.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Тогда не пишите всякую ересь о том, чем не озадачивались.
Объяснение — в том документе, откуда Вы сами же и процитировали. Неумение читать — не моя проблема.
При чем тут «занимать страницу»? Речь шла о проверке возвращаемого malloc() значения на NULL.
Spoiler
Это уже больше смахивает на хронический троллизм и недержание темы.
Хорошо, т.к. Вы не потрудились указать источники своей цитаты, я это сделаю за Вас: man 3 malloc, https://www.gnu.org/software/libc/manual/ht...y-Checking.html Еще полезно может быть man 3 mallopt
Надеюсь те, кому надо, читать умеют.
Мои розовые очки
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: calloc vs malloc
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Хорошо, т.к. Вы не потрудились указать источники своей цитаты
читать разучились?
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: calloc vs malloc
Вы хотите, чтобы я маны пересказал на русском языке для 3-го класса школы? $5/слово.
Я-то понял, а вот Вы поняли? Объяснять лично Вам мне не интересно. Ссылки на документы есть, кому надо — прочитают сами.
watashiwa_darede... писал(а): ↑05.06.2012 17:48При чем тут «занимать страницу»? Речь шла о проверке возвращаемого malloc() значения на NULL.
Ну и?
Это просто прекрасно! Для начала замечу, что источник цитирования принято указывать для каждой цитаты где-нибудь рядом с ней в тексте (так, чтобы было понятно, что именно это —- источник цитаты), либо отдельно выделять, а не вуалировать в виде предложения в стиле «брать на понт» в самом начале поста, для цитаты в самом его конце. Кроме того, указывать источник цитирования «маны» — примерно то же самое, что и указание источника «Российская государственная библиотека» или «Библиотека Конгресса». В мире как-то принято несколько точнее указывать, XXI век все-таки, даже координаты на планете с точностью до метров определять уже может потенциально каждый.
Мои розовые очки
-
- Сообщения: 812
- ОС: Slackware64
Re: calloc vs malloc
watashiwa_daredeska писал(а): ↑05.06.2012 17:48Хорошо, т.к. Вы не потрудились указать источники своей цитаты, я это сделаю за Вас: 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.