Я пытаюсь упаковать структуру, используя 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)
бы исправить это, но это не так.
Наконец нашел это ошибка в 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
сбрасывает значение пакета.
Должно быть 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