1、结构体的问题
(1)地址对齐问题
(2)数据存取效率问题
2、结构体地址边界对齐问题
struct {
char a;
int b;
char c;
short d;
}
假设采用32位处理器,则上述结构体在内存中的布局为:占用了3个字
3、调整结构体元素的布局
struct {
char a;
char c;
short d;
int b;
}
上述结构体在内存中的布局为:占用了2个字
4、结论:
(1)把所有长度为8位的元素安排在结构体的前面
(2)依次在后面安排长度为16位、32位的元素
(3)把数组和大元素安排在后面
(4)对于一条指令,如果结构体太大而不能访问所有的元素,可以
把元素组织成一个子结构体,编译器维持其指针。
5、使用关键字__packed,程序改写为:
__packed struct {
char a;
int b;
char c;
short d;
}
上述结构体在内存中的布局为:占用了2个字
armcc支持使用__packed关键字,可以不必插入填充位。适用于空间非常紧张的场合,但是运行效率非常低。
__packed关键字严重影响效率,大小端不一致也有同样的问题,采用char*可以避免该问题,因为char*在任何时候都是对齐的。