(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).

Это приемлемая жертва, или я думаю об этом неправильно?

Ответы на вопрос(3)

Ваш ответ на вопрос