C / C ++ структура упаковки не работает

Я пытаюсь упаковать структуру, используя g ++ на 64-битный 32-битные окна.

struct Foo
{
uint8_t a;
uint32_t b;
} __attribute__((packed));int main(int argc, char *argv[])
{
qDebug() << "sizeof(Foo):" << sizeof(Foo);
return 0;
}

Это выводит 8. Другие вещи, которые я пробовал:

{ uint8_t a; } // Gives 1, correct.
{ uint8_t a; float b; } // Gives 8, expected 5.
{ uint8_t a; uint16_t b; } // Gives 4, expected 3.
{ uint16_t a; uint8_t b; uint8_t c; } // Gives 4, correct.

Так что, похоже, структура упакована, но sizeof в некоторых случаях округляется? (На самом деле, написав этот вопрос, я думаю, что смогу на него ответить, но все равно выложу его для потомков.)

Редактировать: На самом деле я понятия не имею. я думал aligned(1) бы исправить это, но это не так.

1

Решение

Наконец нашел это ошибка в g ++.

Общая проблема заключается в том, что атрибут ((__packed)) применяется только
до последнего поля структуры. Это причина для размера 9. Трюк
здесь ‘#pragma pack (1)’. Тем самым вы получите ожидаемые размеры. Вопрос
что это выравнивание полей применяется даже для отмеченных структур / объединений
быть упакованным (или через опцию -fpack-struct).

Ну, кажется, есть некоторые сомнения в этом объяснении, но решение работает — используйте #pragma pack(1) вместо этого, как это:

#pragma pack(1)

struct Foo
{
uint8_t a;
uint32_t b;
};

#pragma pack()

Второй #pragma сбрасывает значение пакета.

2

Другие решения

Должно быть 5 в упаковке, у меня работает на

Версия Linux 3.13.0-32-generic (buildd @ kissel) (gcc версия 4.8.2
(Ubuntu 4.8.2-19ubuntu1)) # 57-Ubuntu SMP Вторник, 15 июля 03:51:08 UTC 2014

а также

#include <iostream>
using namespace std;

struct Foo
{
unsigned char a;
unsigned int b;
} __attribute__((packed));int main(int argc, char *argv[])
{
cout << "sizeof(Foo):" << sizeof(Foo);
return 0;
}

успех
комментарии (0)
STDIN
копия

Стандартный ввод пуст

стандартный вывод
копия

SizeOf (Foo): 5

Составлено на Ideone

0

По вопросам рекламы [email protected]