文章目录
- 一、 正常编译:
- 二、 -fpack-struct 全局取消结构体对齐
- 三、 结论:
- 结构体字节不进行对齐的用途
- (1)减小内存占用的空间
- (2)直接将结构体作为通信协议(在低带宽下通讯)
- (3)字节对齐增加RAM大小,减少Flash大小,反之减少RAM大小,增大Flash大小。
- 四、其他局部对其方式
- (1) 使用 __attribute__((packed))
- (2) 利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式:
一、 正常编译:
Total RO Size (Code + RO Data) 20024 ( 19.55kB)
Total RW Size (RW Data + ZI Data) 14736 ( 14.39kB)
Total ROM Size (Code + RO Data + RW Data) 20328 ( 19.85kB)
二、 -fpack-struct 全局取消结构体对齐
Total RO Size (Code + RO Data) 22416 ( 21.89kB)
Total RW Size (RW Data + ZI Data) 14608 ( 14.27kB)
Total ROM Size (Code + RO Data + RW Data) 22712 ( 22.18kB)
三、 结论:
结构体字节不进行对齐的用途
(1)减小内存占用的空间
结构体默认进行对齐,占用的空间比结构体内部成员变量字节加起来大,如果取消字节对齐,可以减小一部分空间。
(2)直接将结构体作为通信协议(在低带宽下通讯)
在不同的平台下,保证结构体内基本数据的长度相同,同时取消结构体的对齐,就可以将定义的数据格式结构体直接作为数据通信协议使用。
(3)字节对齐增加RAM大小,减少Flash大小,反之减少RAM大小,增大Flash大小。
jianqiang.xue
四、其他局部对其方式
(1) 使用 attribute((packed))
例如
struct TEST {
short x;
int y;
}attribute((packed));
(2) 利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式:
#pragma pack (n) // 编译器将按照n个字节对齐;
#pragma pack() // 恢复先前的pack设置,取消设置的字节对齐方式
#pragma pack(pop)// 恢复先前的pack设置,取消设置的字节对齐方式
#pragma pack(1) // 按1字节进行对齐 即:不行进行对齐
#pragma pack (1)
typedef struct TestNoAlign
{
unsigned char u8_test1;
unsigned int u32_test2;
double d8_test3;
static int sta_test5; // 静态变量存储在静态区,不在栈中,所以sizeof运算符不会进行计算其占用的空间,此外c语言不只支持结构体内定义static类型的变量,但是c++支持。
}TestNoAlign;
#pragma pack ()