在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
- 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
- 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
- __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
-
attribute ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
例子:
struct cmd1_
{
uint32_t d1 = 11;
};
struct cmd2_
{
uint8_t u8_d1 = 21;
uint8_t u8_d2 = 22;
uint16_t u16_d3 = 23;
uint32_t u32_d4 = 24;
uint64_t u64_d5 = 25;
uint64_t u64_d6 = 26;
uint32_t u32_d7 = 27;
uint32_t u32_d8 = 28;
};
struct fw_cmd_
{
struct cmd1_ cmd1;
struct cmd2_ cmd2;
};
struct fw_cmd_ fw_cmd;
猜猜sizeof(fw_cmd)=? 应该是4+1+1+2+4+8+8+4+4 = 36实际:
强制按4字节对齐:
#include <iostream>
#include <stdint.h>
#pragma pack(4)
struct cmd1_
{
uint32_t d1 = 11;
};
struct cmd2_
{
uint8_t u8_d1 = 21;
uint8_t u8_d2 = 22;
uint16_t u16_d3 = 23;
uint32_t u32_d4 = 24;
uint64_t u64_d5 = 25;
uint64_t u64_d6 = 26;
uint32_t u32_d7 = 27;
uint32_t u32_d8 = 28;
};
struct fw_cmd_
{
struct cmd1_ cmd1;
struct cmd2_ cmd2;
};
int main(int argc, char** argv)
{
struct fw_cmd_ fw_cmd;
printf("sizeof(uint8_t):%d\r\n", sizeof(uint8_t));
printf("sizeof(uint16_t):%d\r\n", sizeof(uint16_t));
printf("sizeof(uint32_t):%d\r\n", sizeof(uint32_t));
printf("sizeof(uint64_t):%d\r\n", sizeof(uint64_t));
printf("sizeof(fw_cmd):%d\r\n", sizeof(fw_cmd));
return 0;
}
输出: