Какие гарантии дает malloc для выравнивания памяти? - PullRequest
10 голосов
/ 20 декабря 2011

Я обнаружил следующий код:

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%d\n",C);
    return 0;
}  
//output--   152928264     152928288    152928304

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

Ответы [ 3 ]

13 голосов
/ 20 декабря 2011

Согласно этой странице документации ,

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

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

4 голосов
/ 20 декабря 2011

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

0 голосов
/ 26 сентября 2014

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

Например:

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

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

...