Я пытался найти фигуру, но не смог найти ничего удовлетворительного. Я просто попытаюсь объяснить словами.
Если вы сравните таблицу слева и справа, вы увидите, что измененные поля равны 0x400b00 c и 0x400b028, соответственно от 13 и 12 до 22 .
Обратите внимание, что каждый блок памяти имеет верхний и нижний колонтитулы. Поскольку free
было выполнено в 0x400b010, это указывает, что 0x400b00 c является заголовком. Поэтому все записи ниже (400aff c ~ 400b008) останутся без изменений, так как на них не повлияет свободная операция.
Если посмотреть с 0x400b00 c, ранее было 2 блока:
- блок 1: 0x400b00 c ~ 0x400b018
- блок 2: 0x400b01 c ~ 0x400b028
Обратите внимание, что блок 2 не используется, поскольку bit 0 indicates the use of current block
, но значение 0x0000012 является четным. Поэтому, если блок 1 освобожден, блок 1 и блок 2 будут объединены, чтобы сформировать новый неиспользованный блок в целом.
В данном случае происходит то, что этот процесс объединения будет выполняться максимально эффективно. Следовательно, предыдущий нижний колонтитул блока 1 и предыдущий заголовок блока 2 останутся неизменными, поскольку они не нужны. Освобождение областей памяти не требует инициализации.
Таким образом, единственные изменения, которые необходимо сделать, - это новый заголовок и нижний колонтитул нового блока , который находится в позициях 0x400b00 c, и 0x400b028.
Обратите внимание, что между новым верхним и нижним колонтитулами (включительно) имеется 8 блоков, что приводит к 8 * 4 = 32 байта. 32 в двоичном виде - 100000, но поскольку используется предыдущий блок (неизмененный блок), бит 1 устанавливается на 1
. В результате получается 100010, то есть шестнадцатеричное число 22.
Извините, если это объяснение сбивает с толку, спросите, не можете ли вы понять какую-либо часть этого ответа.