LINUX.ORG.RU

Размер выделенного массива (СИ)

 


0

1

Здравствуйте.

Выделяю память под массив:

char *tochdost = calloc(64+64+64+64, sizeof(char));

if(tochdost != NULL)  
 {
   char *encrypt = tochdost + 64;
   char *res_encrypt = encrypt + 64;
   char *pasword = res_encrypt + 64;
   ...

Смотрю размер выделенной области вот так:

printf("SIZE %zu\n", malloc_usable_size(tochdost));

В ответ получаю - SIZE 264.

Скажите, откуда берутся лишние 8 байт?

Язык СИ, Линукс.


NOTES top

The value returned by malloc_usable_size() may be greater than the requested size of the allocation because of alignment and minimum size constraints. Although the excess bytes can be overwritten by the application without ill effects, this is not good programming practice: the number of excess bytes in an allocation depends on the underlying implementation.

The main use of this function is for debugging and introspection.

Deleted ()

Смотрю размер выделенной области вот так

Не надо так. Вы сами должны следить за размером. Всё остальное - чёрная магия.

RazrFalcon ★★★★★ ()

Странный ты, узнать про malloc_usable_size ума хватило, а посмотреть описание нет.

Аллокатор часто выравнивает выделяемые блоки, например по 16 байтам, исходя из объективных (адрес должен быть кратен размеру строки кэша для общей эффективности; по адресу без лишних телодвижений должно быть возможно разместить данные для SIMD, которые также должны быть выровнены) или субъективных (рядом с выделенным блоком он хранит свои структуры которые также должны быть выровнены; а может выбирает размер блока с запасом исходя из только ему ведомой логики) соображений. Лишнее место может быть использовано для бесплатного realloc на небольшой размер.

Только, если ты так и не осилишь man, подчёркиваю: ты никак не можешь использовать это лишнее место (это UB), и вообще malloc_usable_size (это непереносимый интерфейс, которого в других аллокаторах вообще нет).

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

вот блин. Первый раз 20 лет услышал про malloc_usable_size, спасибо.

Но конечно им пользоваться можно _только_ и _исключительно_ для интроспекции и отладки, как и написано выше.

За памятью следить самостоятельно, а когда подрастешь, другие аллокаторы. В эрланге например вообще маллока почти нет.

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

К сожалению, некоторые объявляют malloc_usable_size() моветоном недостойным использования и упоминания.

Да, память выделяется блоками, а не побайтно. Да, если алгоритм чувствителен к размеру масиива и при этом его размер не хранится в переменной, а узнаётся через malloc_usable_size(), возможен неожиданный результат. Тем не менее, просто корректно узнать кол-во выделенной памяти через malloc_usable_size() вполне можно.

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

Для проверки сколько на самом деле выделилось памяти. Алгоритмы бывают разные. Может быть алгоритм таков, что старается использовать выделенную память по максимуму. Тогда после malloc() он проверяет сколько выделилось фактически и после этого начинает работать именно с таким массивом. Ну и т.д.

saahriktu ★★★★★ ()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

можешь привести пример того, где это может быть нужно?

В моём понимании malloc — это такой, неболшой аллокатор на маленькие, редко используемые куски.

Хочешь что-то частое и/или массивное — используй mmap.

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

Нет, практических примеров привести сходу не могу. Чаще всего, да, нужны массивы конкретного размера. Другой вопрос, что если, например, выделяется буфер под строку текста, то алгоритм может захотеть использовать его по полной и не обрезать сколько-то там символов если они по факту таки помещаются в имеющийся буфер.

saahriktu ★★★★★ ()
Последнее исправление: saahriktu (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.