Какие гарантии 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 хранит длину выделенной памяти.