Какие гарантии malloc делает о выравнивании памяти?

я наткнулся на следующий код:

int main()
{
    char *A=(char *)malloc(20);
    char *B=(char *)malloc(10);
    char *C=(char *)malloc(10);
    printf("n%d",A);
    printf("t%d",B);
    printf("t%dn",C);
    return 0;
}  
//output--   152928264     152928288    152928304

Я хочу знать, как распределение и заполнение выполняется malloc(). Глядя на результат, я вижу, что начальный адрес кратен 8. Arethere какие-то другие правила?

3 ответов


Accdording to эта страница документации,

адрес блока, возвращаемого malloc или realloc в системе GNU, всегда кратен восьми (или шестнадцати в 64-разрядных системах).

В общем, malloc реализации конкретной системы. Все они сохраняют некоторую память для своей собственной бухгалтерии (например, фактическую длину выделенного блока), чтобы иметь возможность правильно освободить эту память при вызове free. Если вы нужно выровнять по определенной границе, использовать другие функции, такие как posix_memalign.


единственным стандартным правилом является то, что адрес, возвращаемый malloc будет соответствующим образом выровнен для хранения любой переменной. Что именно это означает, зависит от платформы (поскольку требования к выравниванию варьируются от платформы к платформе).


для 32-битной системы Linux:
Когда malloc () выделяет память, он выделяет память в кратном 8 (заполнение 8) и выделяет дополнительные 8 байтов для бухгалтерского учета.

Например:

malloc (10) и malloc (12) выделят 24 байта памяти (16 байт после заполнения + 8 Байт для бухгалтерии).

malloc () делает заполнение, потому что возвращаемые адреса будут кратны восьми и, следовательно, будут действительны для указателей любого типа. Бухгалтерия 8 байт используется, когда мы вызываем свободную функцию. Bookkeeping bytes хранит длину выделенной памяти.