首页 > 其他分享 >C语言中使用 #pragma pack 和 __attribute(aligned(n)) 【非常有用的字节对齐用法说明】

C语言中使用 #pragma pack 和 __attribute(aligned(n)) 【非常有用的字节对齐用法说明】

时间:2022-10-31 18:05:22浏览次数:54  
标签:__ attribute C语言 pragma 对齐 aligned pack


更改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()


标签:__,attribute,C语言,pragma,对齐,aligned,pack
From: https://blog.51cto.com/xuejianqiang/5810721

相关文章