Скажите, у меня есть выровненный массив
alignas(X) char arr[sizeof(X)];
это указатель
X * ptr = reinterpret_cast<X*>(arr);
гарантированно выровнено в соответствии с требованиями выравнивания X
?
Кажется очевидным, что это так, однако это не кажется очевидным из стандарта C ++.
Я не нахожу в стандарте ничего, что мешало бы компилятору выравнивать структуру вида
struct X
{
int16_t a;
int32_t b;
int16_t c;
};
как это в памяти:
+-+-+-+-+-+-+-+-+
|a|a|b|b|b|b|c|c|
+-+-+-+-+-+-+-+-+
^
aligned to 32-boundary
, чтобы объекты типа X
были выровнены таким образом, чтобы заполнение не требовалось, и b
одновременно выровнялось правильно по 32-битной границе. Заявление (N4713, § 6.6.5.1)
alignment - это целочисленное значение, определяемое реализацией, представляющее количество байтов между последовательными адресами, по которым данный объект может быть выделен.
не нарушается этим, и я не вижу никаких других утверждений в стандарте, которые его нарушают.