打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、 正常编译:

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 ()
posted on 2023-02-10 08:25  xuejianqiang  阅读(112)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033