Вероятно, в большинстве реализаций malloc
есть какой-то способ найти выделенный размер аргумента указателя.
Однако способ сделать это является частным для реализации, а некоторые malloc
Реализация не всегда выделяет префиксный заголовок для каждой зоны.
Обычный прием реализации malloc
заключается в том, чтобы по-разному обрабатывать различные выделенные размеры.Например, он может обрабатывать по-разному
malloc
из двух слов или менее (т. Е. 2*sizeof(void*)
), поскольку этот случай очень частый (например, для односвязного списка указателей, например * 1015).* ячейки в Лиспе). malloc
зон малого размера, размер которых меньше порога, обычно размера страницы - в смысле системного вызова getpagesize (2) в Linux, часто 4 КБ. malloc
зон большого размера, больше, чем размер страницы
В некоторых реализациях учитывается фактический адрес, например, при наличии внутренней арены (сегментыстраниц), предназначенных для пар, еще одна арена распределения, предназначенная для зон небольшого размера размером 2^n
и 3*2^n
(например, n>2 && n<10
), и для больших объектов, фактически выделенных на их собственной арене каждая.Тогда у реализации malloc
есть несколько адресов внутренних хеш-таблиц (каждый из младших 16 битов, каждый из которых равен нулю) в арены.
Поэтому не следует предполагать, что каждая зона с ошибками раньше имела издержки.Это может быть неправильно.Если вам нужно такое предположение, напишите свой собственный malloc
эквивалент (или замену), используя вызовы операционной системы (например, mmap (2) в Linux).