C语言中使用 #pragma pack 和 __attribute(aligned(n)) 【非常有用的字节对齐用法说明】
原创
©著作权归作者所有:来自51CTO博客作者xuejianqiang的原创作品,请联系作者获取转载授权,否则将追究法律责任
更改c编译器的缺省字节对齐方式:
在缺省情况下,c编译器为每一个变量或数据单元按其自然对界条件分配空间;一般地可以通过下面的两种方法来改变缺省的对界条件:
方法一(体积对齐):
使用#pragma pack(n),指定c编译器按照n个字节对齐;
使用#pragma pack(),取消自定义字节对齐方式。
#pragma pack(4) /*指定按4字节对齐,等价于#pragma pack(push,4)*/
uint8_t rf_freq_table[RF_FREQ_MAX_VAL] = {0x20, 0x21, 0x22, 0x23, 0x24};
uint8_t rf_mac_addr[RF_MAC_MAX_VAL] = {0x55, 0x56, 0x57, 0x58, 0x59};
#pragma pack() /*取消指定对齐,恢复缺省对齐,等价于#pragma pack(pop)*/
方法二(地址对齐):
__attribute(aligned(n)),让所作用的数据成员对齐在n字节的自然边界上;如果结构中有成员的长度大于n,则按照最大成员的长度来对齐;
__attribute((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
比如:
typedef struct
{
...
}__attribute__((aligned(4))) param_t;
__attribute__((aligned(4))) system_info_t system_info;
方法三:双重对齐
#pragma pack(4)
__attribute__((aligned(4))) uint8_t rf_freq_table[RF_FREQ_MAX_VAL] = {0x20, 0x21, 0x22, 0x23, 0x24};
__attribute__((aligned(4))) uint8_t rf_mac_addr[RF_MAC_MAX_VAL] = {0x55, 0x56, 0x57, 0x58, 0x59};
#pragma pack()