Я обнаружил, что malloc()
выделяет больше пространства памяти, чем я прошу.Почему malloc выделяет больше пространства памяти, чем я прошу?
struct { void *ptr; int var; } msg; // 16 bytes (checked by sizeof())
for (int i = 0; i < 100000000; i++)
malloc(sizeof(msg));
В качестве вышеупомянутого кода, на самом деле malloc()
выделить 32 байт на вызов функции (рассчитанный top
), но valgrind
показывает только 16 байт на вызов на самом деле.
Почему malloc выделяет больше пространства памяти, чем я прошу, и как заставить malloc()
не тратить столько пространства памяти?
Удивительно, что он выделяет 32 байта также, даже если структура равна 24 байтам, поэтому я предполагаю, что пространства памяти теряются. Я не уверен, должно ли malloc()
выделить несколько 32 байтов. Если это правда, то пространство памяти пропадает.
EDITED:
Я проверил для других обстоятельств.
+---------+---------------------------+
| n | memory usage of malloc(n) |
+---------+---------------------------+
| 1 ~ 24 | 32 bytes |
+---------+---------------------------+
| 25 ~ 40 | 48 bytes |
+---------+---------------------------+
| 41 ~ 56 | 64 bytes |
+---------+---------------------------+
Память не в полной мере, если используется n
не 16 * m + 8
, m
∈ ℕ. Некоторые пробелы в памяти понятны из-за выравнивания памяти, когда n
равно 22, но по-прежнему следует считать впустую, когда n
равно 16. На большинстве платформ размер минимального блока доступа к памяти составляет 4 байта или 8 байтов, поэтому почему GCC-реализация выбирает 16 байт на увеличение.
Накладные расходы на выделение. 'malloc' нуждается в некоторой памяти для собственных структур данных. См., Например, [Malloc vs custom allocator: у Malloc много накладных расходов. Почему?] (Http://stackoverflow.com/questions/13064850/malloc-vs-custom-allocator-malloc-has-a-lot-of-overhead-why) – kaylum
Удивительно, что он выделяет 32 байта ** также ** даже если структура составляет 24 байта, поэтому я предполагаю, что пространства памяти ** теряются **. –
Почему вы говорите, что это напрасно? Отходы подразумевают стоимость без чего-либо взамен, что на самом деле не так. Это стоимость управления памятью определенным образом. – kaylum