1、结构体内存对齐
对齐原则:假设结构体成员大小是m字节,其地址是m的倍数。
struct S2
{
int i;
int j;
char c;
};
32位单片机,IAR仿真结果是12

要正确计算这个结构体的大小,需要这样考虑:创建这个结构体的数组,每个数组元素都会满足它的对齐要求。
如果给这个结构体分配 9 个字节。考虑结构体数组 struct s2 a[4],就不能满足数组 a 的每个元素的对齐要求。假设数组的起始地址为 x,则每个元素的地址分别为 x、x+9、x+18、x+27,有三个元素不满足对齐原则。
由此,编译器会为结构 s2 分配 12 个字节,最后三个字节是补充的空间(浪费的空间),即在结构体的末尾增加填充。
#pragma pack(1)
struct S3
{
int i;
int j;
char c;
}
#pragma pack()
编译预处理指令#pragma pack()使得在这之间定义的结构体按照 1 字节方式对齐。
32位单片机,IAR编译器仿真结果是9

博客主要介绍了结构体内存对齐原则,即结构体成员大小为m字节时,其地址是m的倍数。以32位单片机为例,分析了结构体大小的计算,指出若分配9字节无法满足结构体数组元素对齐要求,编译器会分配12字节并在末尾填充。还提到编译预处理指令#pragma pack()可使结构体按1字节对齐,此时仿真结果为9。
3578

被折叠的 条评论
为什么被折叠?



