LINUX.ORG.RU
ФорумTalks

[вещества] calloc

 


0

1

А в чём, собственно, разница между вызовами

calloc(nelem, size);
calloc(size, nelem);
calloc(1, nelem * size);
calloc(nelem * size, 1);

Может ли вообще в принципе существовать реализация, на которой эти четыре вызова дадут разный результат?

И если нет, то зачем calloc два аргумента?

В выравнивании (alignment). Элементы выровнены таким образом, чтобы доступ к ним был наиболее эффективным на target платформе.

kmeaw ★★★
()
Ответ на: комментарий от kmeaw

А вот и нет.

Стандарт указывает, что calloc возвращает память для *массива* из nelem объектов размера size.

А элементы массива всегда располагаются в памяти вплотную, без выравнивания.

LucidFox
() автор топика
Ответ на: комментарий от LucidFox

>располагаются в памяти вплотную
Вплотную, но calloc может вернуть адрес выровненный на границу, кратную размеру элемента.

GAMer ★★★★★
()

> calloc(size, nelem);

calloc(1, nelem * size);


Если во втором случае умножение приведёт к переполнению, будет печально. В первом случае просто вернёт NULL. Во всяком случае, должно.

geekless ★★
()
Ответ на: комментарий от geekless

Я считаю, что за попытку захапать больше SIZE_MAX памяти нужно не NULL возвращать, а отрывать программисту руки. :p

Хотя аргументы хорошие. Оба.

LucidFox
() автор топика
Ответ на: комментарий от GAMer

В какой системе это так? Везде calloc реализуется через malloc, а malloc ничего не выравнивает. Для выделения выровненной памяти есть posix_memalign.

Reset ★★★★★
()
Ответ на: комментарий от LucidFox

> за попытку захапать больше SIZE_MAX памяти нужно не NULL возвращать, а отрывать программисту руки

Теоретически, это готовая уязвимость, если в программе нет проверок. Вспомнилась давняя заметка на эту тему у openbsd-шников: http://undeadly.org/cgi?action=article&sid=20060330071917

geekless ★★
()
Ответ на: комментарий от Reset

Кстати, разве malloc не вернёт адрес выровненный на страницу?
Или вернёт что попало, а потом будет героически бороться с фрагментацией?
Или сейчас в ядре у разных аллокаторов это поведение отличается?

GAMer ★★★★★
()
Ответ на: комментарий от GAMer

> Кстати, разве malloc не вернёт адрес выровненный на страницу?

С какого перепуга?

Или вернёт что попало, а потом будет героически бороться с фрагментацией?

Т.е. если фрагментация будет сразу идти по 4 килобайта, то с ней можно уже и не бороться?

Или сейчас в ядре у разных аллокаторов это поведение отличается?

При чем тут ядро вообще?

geekless ★★
()
Ответ на: комментарий от GAMer

Как ему вздумается так и вернет. В винде, например, возвращается невыровненный адрес.

Reset ★★★★★
()
Ответ на: комментарий от GAMer

Аллокатор у malloc'а не в ядре, а в libc. И возвращать адреса, выровненные на страницу, он не обязан. Как минимум malloc должен выравнивать по размеру машинного слова, иначе будут сюрпризы на некоторых архитектурах. В glibc, согласно man posix_memalign, malloc выравнивает по 8 байт.

Deleted
()
Ответ на: комментарий от geekless

>При чем тут ядро вообще?
Туплю, да =)
Имел практику только с архитектурами без MMU, потому и плаваю.

GAMer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.