Куча обрабатывается реализацией, не обязательно, как вы ожидаете. Стандарт явно не гарантирует ничего о порядке или смежности. Есть две основные вещи, которые заставляют использовать больше пространства кучи, чем вы просили.
Во-первых, выделенная память должна быть выровнена так, чтобы она подходила для использования любым объектом. Как правило, компьютеры ожидают, что примитивные объекты данных N байтов будут выделены кратно N, так что, скорее всего, вы не сможете получить malloc()
, чтобы вернуть значение, не кратное 8.
Во-вторых, необходимо управлять кучей, так что free()
позволяет повторно использовать память. Это означает, что диспетчер кучи должен отслеживать выделенные и нераспределенные блоки и их размеры. Один из способов - поместить некоторую информацию в память непосредственно перед каждым блоком, чтобы менеджер мог знать, какой размер блока нужно освободить, и где находятся блоки, которые можно использовать повторно. Если это то, что делает ваша система, то между выделенными блоками будет использоваться больше памяти, а учитывая ограничения выравнивания в 8 байтов, скорее всего, вы не сможете получить выделения менее 16 байтов.