Еще раз, я задаюсь вопросом давней веры.
До сегодняшнего дня я считал, что выравнивание следующей структуры обычно равно 4, а размер обычно равен 5...
struct example
{
int m_Assume_32_Bits;
char m_Assume_8_Bit_Bytes;
};
Из-за этого предположения у меня есть код структуры данных, который использует offsetof для определения расстояния в байтах между двумя соседними элементами в массиве. Сегодня я заметил какой-то старый код, который использовал sizeof, где он не должен, не мог понять, почему у меня не было ошибок, закодировано unit test - и тест удивил меня, пройдя.
Несколько исследований показали, что размер типа I, который использовался для теста (аналогичный вышеприведенной структуре), был точным кратным выравниванию - т.е. 8 байтов. После последнего участника у него было дополнение. Вот пример того, почему я никогда не ожидал этого...
struct example2
{
example m_Example;
char m_Why_Cant_This_Be_At_Offset_6_Bytes;
};
Немного Googling показал примеры, которые дают понять, что это дополнение после окончательного члена разрешено - например http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding ( "или в конце структуры" ).
Это немного неловко, поскольку я недавно опубликовал этот комментарий - Использование отладки структуры (мой первый комментарий к этому ответу).
То, что я не могу определить, заключается в том, гарантируется ли это заполнение точным кратным выравнивания стандартом С++, или это то, что разрешено и что некоторые (но, возможно, не все) компиляторы делают.
Итак - размер структуры, который должен быть точным кратным выравниванию этой структуры в соответствии со стандартом С++?
Если стандарт C предоставляет разные гарантии, меня это тоже интересует, но основное внимание уделяется С++.