Цитата(kt368 @ Oct 27 2011, 12:57)

А что это значит?
Почти на всех (если не на всех) процессорах, имеющих разрядность данных больше 8 бит (1 байт), существует требование по выравниванию данных. Например, однобайтовые слова могут располагаться по любым адресам, двухбайтовые - по адресам, кратным 2, четырёхбайтные (а также, например, массивы, структуры, объединения) - кратным 4. Поэтому, если объявить на какой-нить 32-разрядной платформе:
Код
struct TSlon
{
char a;
long b;
};
то в памяти физически это будет лежать так, что 'a' займёт один байт под адресу, кратному 4, потом будет три незанятых байта, а 'b' будет лежать по следующему адресу, кратному 4. Т.е. казалось бы sizeof структуры должен быть равен 5, а в реальности он будет равен 8.
Теперь представьте себе, что вы эту структуру отправляете на платформу, где нет такого требования и все данные лежат подряд без паддинга ("дырок"). Ясно, что получив сырой массив из байт, дальнейшая интерпретация полей будет неверной. Чтобы избавиться от этого, можно компилятору сказать, чтобы он принудительно упаковывал данные всегда без "дырок", тогда битовое представление будет правильным везде (кроме случаев с разным big/little endian). Для этого у подавляющего большинства компиляторов существует специальная директива - нечто вроде #pragma packed, как оно точно называется и используется, надо смотреть в документации на конкретный компилятор.
Пакованные структуры значительно менее эффективны в использовании - тут компилятору приходится самому (при обращении к полям) каждый раз упаковывать/распаковывать. К тому же, как уже говорилось ранее, #pragma директивы - вещь платформеннозависимая, поэтому переносимости тут тоже нет. Учитывая вышесказанное, имеет смысл подумать над собственным способом сериализации, возможно, он окажется более подходящим, хотя и потребует написания кода руками.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков