Как заголовок блока отформатирован в куче? - PullRequest
0 голосов
/ 06 июня 2018

Я знаю, что в 32-битном заголовке наиболее значимые 29 бит - это число, а наименее значимые 3 бита указывают, что блок свободен или выделен.Но я не понимаю, почему, например, в 24-битном блоке размер равен 0x018, а 3 младших бита равны 0x001, когда он выделен, а заголовок становится 0x019.Почему заголовок «0x019»?Мы не должны добавлять эти два?

Почему заголовок не "0x018001" вместо этого? enter image description here

1 Ответ

0 голосов
/ 06 июня 2018

Трудно сказать по твоему вопросу, где твое недоразумение.

В этом примере 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, как показано выше с примерами значений.

...