嵌入式开发C_2
2.1 结构体内存对齐原则?
(1)第一个成员的首地址(地址偏移量)为0。
(2)成员对齐:以4字节对齐为例,如果自身类型小于4字节,则该成员的首地址是自身类型大小的整数倍;如果自身类型大于等于4字节,则该成员的首地址是4的整数倍。若内嵌结构体,则内嵌结构体的首地址也要对齐,只不过自身类型大小用内嵌结构体的最大成员类型大小来表示。数组可以拆开看做n个数组元素,不用整体看作一个类型。
(3)最后结构体总体补齐:以4字节对齐为例,如果结构体中最大成员类型小于4字节,则大小补齐为结构体中最大成员类型大小的整数倍;如果大于等于4字节,则大小补齐为4的整数倍。内嵌结构体也要补齐。
注意:32位编译器,一般默认对齐方式是4字节。
2.2 结构体内存对齐的原因?
(1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据。
(2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐,因为访问未对齐的内存,处理器需要做两次内存访问,而访问对齐的内存仅需要一次。如下图所示,访问对齐的short变量只需要一次,而访问未对齐的int变量则需要访问两次。
2.3 给定结构体,它在内存中占用多少字节(32位编译器)?
struct A { char t : 4; // 4位 char k : 4; // 4位 unsigned short i : 8; // 8位 unsigned long m; // 4字节 };
根据结构体内存对齐原则,共占用8字节。