В общей ситуации структуры/класса может существовать выравнивание между членами. Но мне интересно, будет ли это с уверенностью предположить, что это особый случай:Выравнивание после элемента массива того же типа
template<typename T, size_t N>
struct MyStruct {
T data[N];
T term;
constexpr MyStruct();
};
будет надежно эквивалент этого:
template<typename T, size_t N>
struct MyStruct {
T data[N+1];
constexpr MyStruct();
};
Причина спрашиваю, что я на самом деле хочу, чтобы быть в состоянии явно инициализировать последний элемент массива в конструкторе constexpr (но мне все равно, что остальное). Например, с верхней MyStruct я могу это сделать:
template<typename T, size_t N>
constexpr MyStruct<T,N>::MyStruct() : data{}, term{0} {}
Но я хочу, чтобы результат такой же, как если бы срок был действительно последний элемент массива.
Безопасно ли это? Если нет, есть ли способ достичь того же, используя вторую форму MyStruct?
В соответствии с §5.3.6 массив и тип имеют одинаковое выравнивание, поэтому не должно быть никаких отступов. Но в §9.2 говорится: «[..] Требования к выравниванию реализации могут привести к тому, что сразу два соседних элемента не будут распределены сразу после друг друга, поэтому могут потребоваться требования к пространству для управления виртуальными функциями (10.3) и виртуальными базовыми классами (10.1)». _ Может ли кто-нибудь построить случай, когда это не удается? – 2013-04-12 14:53:51
Спасибо, это полезно. Я пробовал различные эксперименты с gcc и еще не нашел сбой. Я играю только с простыми структурами, мой текущий вариант использования не потребует виртуальных типов. – GeoffW
У меня возникло бы желание использовать 'union' и, по крайней мере, сделать математику размера' static_assert'. И некоторую математику 'assert', чтобы убедиться, что' & two.last == & one.arr [N-1] '. – Yakk