Выравнивание структуры не работает с #pragma pack

У меня есть структура C++:

struct a
{
     char b;
     int c;
     int d[100];
};

Размер структуры должен быть 405 байтов. Я видел, что размер структуры составляет 408 байт. Причина в выравнивании до 8 байтов после целого числа "c". Массив "d" должен начинаться с 6-го байта структуры, а не с 9-го байта. я использовал #pragma pack(1) но это не решило проблему. Я не могу изменить порядок полей в структуре. У вас есть идеи, как я могу решить эту проблему? Спасибо!

1 ответ

Упаковка ошибок для большинства компиляторов, которые я использую, состоит в том, что объекты выравниваются по своему размеру Упаковка по умолчанию для вашей структуры будет вставлять заполнение после символа и перед первым int, чтобы поместить это int на 4-байтовую границу. Очевидно, это поведение, которое вы видите.

Код, который я использую в Visual Studio для создания упаковки, выглядит следующим образом.

#pragma pack(push,1)
struct a {
  char b;
  int c;
  int d[100];
};
#pragma pack(pop)

Удаляет заполнение, выравнивая int по байту 1.

Если у меня будет время, я проверю его на нескольких версиях VS, чтобы подтвердить это, но мой текущий код работает точно так же. Вот как это делается, поэтому единственный вопрос, почему это не работает для вас.

РЕДАКТИРОВАТЬ: размер (а) 405, как и ожидалось. Смещение b составляет 1. VS2012. Gcc это то же самое.

Другие вопросы по тегам