size = (size+3) & ~3
округляет размер до ближайшего кратного 4.
Это делается для того, чтобы все блоки были кратны 4 байтам, а каждый блок начинался с адреса, кратного 4.
Это необходимо для того, чтобы расположение целых и указателей внутри блока можно было выровнять, чтобы они соответствовали отдельным словам в памяти, что делает доступ к ним более эффективным. Некоторые процессоры действительно требуют этого.
Чтобы увидеть, как работает округление, скажем, что size = 4x-a , где 0 <= a <= 3 </em>. У нас есть:
размер + 3 = 4x + (3-a) , где 3-a также находится между 0 и 3 .
~ 3 - битовая маска, включающая все биты, кроме 2 0 и 2 1 , таким образом, операция & оставит только кратное 4:
(размер + 3) & ~ 3 = 4x