Трудно сказать по твоему вопросу, где твое недоразумение.
В этом примере 0x018
- это десятичное число 24 и двоичное значение 11000
.Это размер блока в байтах.
Поскольку разработчик malloc
решил выделить блоки с размерами, кратными 8-байтным, все размеры блоков будут заканчиваться на 0 или 8 (двоичные 0000 или 1000).Это означает, что младшие 3 бита всегда равны нулю.
Вместо того, чтобы выделять дополнительный заголовок в заголовке только для одного бита, который указывает, выделен ли блок или свободен, этот проект сохраняет 0/1 в бите самого низкого порядка, предполагая, что он может быть замаскированout (с побитовым «и» в C, &
), когда необходим размер блока.Этот бит "или" редактируется с размером блока, чтобы получить заголовок: 0x18 | 1
, который выдает 0x19
.В двоичном виде это 11000 | 1 = 11001
.
Я не понимаю, почему вы думаете, что размер смещен влево.
В более общем случае, если h
- это 32-битное значение заголовка, тогда размер блока равен h & ~0x7
,который также может быть записан h & 0xfffffff8
, а выделенный флаг равен h & 1
.
Аналогично, если у вас есть размер блока z
и выделенный бит a
, тогда заголовок всегда задается как h = z | a
или, если хотите, h = z + a
, как показано выше с примерами значений.