对STM32 32位单片机中结构体struct的字节对齐(RAM)的理解

您所在的位置:网站首页 结构体中字节对齐是按最大字节吗 对STM32 32位单片机中结构体struct的字节对齐(RAM)的理解

对STM32 32位单片机中结构体struct的字节对齐(RAM)的理解

2024-07-12 04:00| 来源: 网络整理| 查看: 265

本文参考和整合网络资源,高度概括,简约不简单,一起快乐搬砖

结构体字节对齐说明

本示例均采用编译器默认字节对齐方式来说明,STM32 在KEIL中内存为4字节对齐。 #pragma pack() //取消自定义字节对齐方式

各字符类型占用字节数(对齐值) 类型占用内存(对齐值) /字节char1short2int4float4double8 对齐规则 起始地址应满足: 起始地址 % 对齐值 = 0总字节数应满足: 总字节数 % 最大对齐值 =0

最大对齐值即结构体中占用字节数最多的一个变量的对齐值。

示例1:

按对齐规则1分配空间:

struct A { int a; //a的起始地址0x00满足0x00%4=0,所以a存放在0x00~0x03 char b; //b的起始地址0x04满足0x04%1=0,所以b存放在0x04 short c; //c的起始地址0x05%2≠0,而0x06%2=0,因此c存放在0x06~0x07, 0x05为补空字节(1字节) };

检查对齐规则2:现总共字节为8,满足8%4=0,不需要在末尾补空,因此最终总字节数为8

示例2:

按对齐规则1分配空间:

struct B { char b; //b的起始地址0x00满足0x00%1=0,所以b存放在0x00 int a; //a的起始地址0x01%4≠0,而0x04%4=0,所以a存放在0x04~0x07,0x01~0x03为补空字节(3字节) short c; //c的起始地址0x08%2=0,因此c存放在0x08~0x09 };

检查对齐规则2:现总共字节为10,但10%4 ≠ 0,而12%4=0,因此在末尾补空0x0A~0x0B, 最终总字节数为12

示例3:

按对齐规则1分配空间:

struct str1 { char a; //a的起始地址0x00%1=0,所以a存放在0x00 int b; //b的起始地址0x01%4≠0,而0x04%4=0,所以b存放在0x04~0x07,0x01~0x03为补空字节(3字节) float c; //c的起始地址0x08%4=0,所以c存放在0x08~0x0B double d; //d的起始地址0x0C%8≠0,而0x10%8=0,所以d存放在0x10~0x17,0x0C~0x0F为补空字节(4字节) };

检查对齐规则2:现总共字节为24,满足24%8=0,不需要在末尾补空,因此最终总字节数为24

恭喜你,看到这,你已了解了32位单片机内存对齐基本知识


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3