C语言更改结构体的默认对齐方式

在C语言中,你可以使用#pragma pack__attribute__((packed))来改变结构体的对齐方式以减少填充字节。以下是两种方法的示例:
假如我们有一个结构体需要改变其对齐方式,以减少字节填充

使用 #pragma pack

#pragma pack(push, 1) // 将对齐设置为1字节
typedef struct
{ 
    BYTE bDataType;         // 数据类型
    WORD wFaultNumber;      // 故障序号
    WORD wPowerGrid;        // 电网故障序号(未用)
    BYTE bNOC;              // 模拟量路数
    WORD wNOE;              // 每路模拟量的点数
    WORD wINT;              // 非实际数
    DWORD dwNotUsed;        // 没有使用,全部为零
    WORD wStartRecordWave;  // 启动与录波开始的间隔点数
    WORD wExitRecordWave;   // 出口与录波开始的间隔周波数
    WORD wReturnRecordWave; // 返回与录波开始的间隔周波数
    BYTE bData;             // 数据
} TJC103_Wave;
#pragma pack(pop) // 恢复默认对齐设置

使用 __attribute__((packed))

typedef struct
{ 
    BYTE bDataType;         // 数据类型
    WORD wFaultNumber;      // 故障序号
    WORD wPowerGrid;        // 电网故障序号(未用)
    BYTE bNOC;              // 模拟量路数
    WORD wNOE;              // 每路模拟量的点数
    WORD wINT;              // 非实际数
    DWORD dwNotUsed;        // 没有使用,全部为零
    WORD wStartRecordWave;  // 启动与录波开始的间隔点数
    WORD wExitRecordWave;   // 出口与录波开始的间隔周波数
    WORD wReturnRecordWave; // 返回与录波开始的间隔周波数
    BYTE bData;             // 数据
} __attribute__((packed)) TJC103_Wave;

解释

  • #pragma pack(push, 1)#pragma pack(pop):这是一个编译器特定的指令,用于临时改变结构体的对齐方式。push将当前的对齐设置保存在栈中,并设置新的对齐方式。pop用于恢复之前的对齐设置。

  • __attribute__((packed)):这是GCC编译器的一个扩展,用于告诉编译器不要为结构体的成员进行任何额外的对齐填充。这种方法适用于GCC和一些兼容的编译器。

使用这两种方法中的任一种可以确保结构体成员紧密排列在一起,从而减少结构体的总大小。然而,需要注意的是,这样做可能会降低数据访问的效率,因为它可能会导致对未对齐数据的访问,这在某些平台上可能会有较大的性能影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CFuYuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值