嵌入式开发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字节。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务