Проблема выравнивания заключается в том, что современные 32-разрядные процессоры работают с 32-разрядными размерами слов на границах 32-разрядных адресов.Если 32-разрядное слово на 32-разрядной границе содержит 2 16-разрядных значения, это приводит к тому, что для получения правильных 16-разрядных значений требуются дополнительные инструкции (т. Е. Маскирование и сдвиг, так что правильные 16-разрядные значения - это все, что остается),Если 32-разрядное слово разделено на 32-разрядную границу, то для его извлечения требуется еще больше работы.
По умолчанию компромисс состоит в том, чтобы иметь более быстрые программы и не использовать память так же эффективнонасколько это возможно.Если дополнительная пара инструкций необходима везде, где используется элемент структуры, тогда, вероятно, будет использовано больше памяти, чем при более плотной упаковке, сохраняемой структурой, поэтому, хотя сначала это не очевидно, это правильный выбор.
Если у вас есть требованиедля эффективного хранения структур (с затратами на производительность), тогда «#pragma pack» позволяет вам сжать членов пакета, но это приводит к более медленным программам.
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html
http://www.cplusplus.com/forum/general/14659/