C/C++字节对齐
1.G_PACKED
#ifdef __GNUC__
#define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
#define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))
#endif
G_PACKED(
typedef struct __abc
{
uint8_t Forced_lock; /*< 数据,赋值操作,*/
uint32_t reserve; /*< 数据,赋值操作,预留*/
uint8_t hover_now; /*< 数据,赋值操作,*/
}) abc_s;
2.1 pack(push)
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
} fileTransmitExit_t;
#pragma pack(pop)//恢复对齐状态
2.2 pack(1)
#pragma pack(1) // 按照1个字节对齐
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
}fileTransmitExit_t4;
#pragma pack() // 取消自定义对齐方式
全部例子
#pragma once
#include <iostream>
using namespace std;
#ifdef __GNUC__
#define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
#define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))
#endif
G_PACKED(
typedef struct __abc
{
uint8_t Forced_lock; /*< 数据,赋值操作,*/
uint16_t reserve; /*< 数据,赋值操作,预留*/
uint8_t hover_now; /*< 数据,赋值操作,*/
}) test1;
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
uint8_t msgType2;
} test2;
#pragma pack(pop)//恢复对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
uint8_t msgType2;
}test3;
#pragma pack()//恢复对齐状态
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
uint8_t msgType2;
}__attribute__ ((aligned(1))) test4;
typedef struct
{
uint8_t msgType; //消息类型
uint16_t exitReason; //退出原因
uint8_t msgType2;
}__attribute__((packed)) test5;
int main()
{
cout << "Hello World!" << endl;
printf("test1 size1:%d\n", sizeof (test1));
printf("test2 size2:%d\n", sizeof (test2));
printf("test3 size3:%d\n", sizeof (test3));
printf("test4 size4:%d\n", sizeof (test4));
printf("test5 size4:%d\n", sizeof (test5));
return 0;
}
Qt windows 输出结果
ubuntu2004 linux环境