(C) как распределитель кучи обрабатывает 4-байтовый заголовок блока, возвращая только адреса, кратные 8?
Кажется, это не имеет смысла, если только мы не проигнорируем потенциальное избыточное пространство в начале сегмента, а затем не выделим первый выделенный фрагмент в первом кратном 8 (с соответствующим первым заголовком, равным этому адресу -4). , Это оставило бы много байтов до этого неиспользованным. Это то, что обычно делается?
редактировать: спасибо paxdiablo за подробное объяснение ниже. это все имеет смысл для 16-байтовых заголовков. Тем не менее, я работаю с 4-байтовым заголовком, который выглядит примерно так:
struct mhdr {
int size; // size of this block
} tMallocHdr;
Теперь, если моя куча начинается с адреса, кратного 8, и любой адрес, возвращаемый malloc, должен быть кратным 8, и мне нужно использовать 4-байтовые заголовки, я, кажется, вынужден «тратить» первый 4 байта моей кучи. например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
^
(heap starts)
Если куча начинается с адреса выше по адресу 8, используя схему адресации в этом примере, первый возвращаемый адрес, который я мог бы вернуть пользователю после вызова malloc, будет 16; мне нужно 4 байта заголовка, и первый адрес, кратный 8, который позволяет 4 байта заголовка, равен 16 (заголовок начинается с 12). Это означает, что я потратил первые 4 байта моей внутренней памяти кучи, чтобы выровнять вещи (8-11).
Это приемлемая жертва, или я думаю об этом неправильно?