Заполнение выравнивания структуры, наибольший размер заполнения и порядок элементов структуры
Я узнал о заполнении структурных данных с тех пор, как узнал, что мой оператор sizeof () не возвращает того, что я ожидал. Согласно шаблону, который я наблюдал, он выравнивает элементы структуры по наибольшему типу данных. Так например ...
struct MyStruct1
{
char a; // 1 byte
char b; // 1 byte
char c; // 1 byte
char d; // 1 byte
char e; // 1 byte
// Total 5 Bytes
//Total size of struct = 5 (no padding)
};
struct MyStruct2
{
char a; // 1 byte
char b; // 1 byte
char c; // 1 byte
char d; // 1 byte
char e; // 1 byte
short f; // 2 bytes
// Total 7 Bytes
//Total size of struct = 8 (1 byte of padding between char e and short f
};
struct MyStruct3
{
char a; // 1 byte
char b; // 1 byte
char c; // 1 byte
char d; // 1 byte
char e; // 1 byte
int f; // 4 bytes
// Total 9 bytes
//Total size of struct = 12 (3 bytes of padding between char e and int f
};
Однако, если сделать последний элемент 8-байтовым типом данных, например long long, он все равно добавляет только 3 байта заполнения, создавая выровненную четырехбайтовую структуру. Однако, если я собираю в 64-битном режиме, он на самом деле выравнивается на 8 байтов (самый большой тип данных). Мой первый вопрос: я не прав, говоря, что это выравнивает элементы с наибольшим типом данных? Это утверждение кажется верным для 64-битной сборки, но в 32-битной сборке имеет значение только до 4-байтовых типов данных. Имеет ли это отношение к собственному «размеру слова» процессора? Или сама программа?
Мой второй вопрос: будет ли следующая трата пространства и плохое программирование?
struct MyBadStruct
{
char a; // 1 byte
unsigned int b; // 4 bytes
UINT8 c; // 1 byte
long d; // 4 bytes
UCHAR e; // 1 byte
char* f; // 4 bytes
char g; // 1 byte
// Total of 16 bytes
//Total size of struct = 28 bytes (12 bytes of padding, wasted)
};
Благодарю.