Существует ли переносимый способ, который зависит только от того, что предлагает стандарт C99, для определения максимально необходимого выравнивания, необходимого для любого типа данных.Как определить максимальное требуемое выравнивание в C99
Нравится maxalign_t
in C++ 11.
То, что я сейчас делаю вычисляет наименьшее общее кратное (lcm
) из створах int
, long int
, long long int
, double
, void *
и size_t
как лучший усилию способ определения выравнивания.
Update: я в настоящее время это нужно для реализации обертки malloc
, который хранит метаданные в начале блока памяти и возвращает указатель с большим адресом, чем то, что malloc
вернулся.
Грустно слышать это. Я буду оценивать, можно ли переключиться на C11, иначе используйте intmax_t. – FSMaxB
Чтобы быть еще более параноидальным, вы можете использовать требование выравнивания 'intmax_t' или' long double', в зависимости от того, что больше. –
@SteveSummit: Не забывайте 'void *'. 128-битный тип указателя мог бы объединять информацию о базовом адресе, размере и смещении, позволяя ошибочным манипуляциям с указателями быть более эффективно, чем это было бы возможно, используя простые линейные указатели. – supercat