1、结构体的问题

(1)地址对齐问题

(2)数据存取效率问题

2、结构体地址边界对齐问题

struct {

        char a;

        int b;

        char c;

        short d;

        }

假设采用32位处理器,则上述结构体在内存中的布局为:占用了3个字

嵌入式C语言结构体_数组

 3、调整结构体元素的布局

struct {

        char a;

        char c;

        short d;

        int b;

        }

上述结构体在内存中的布局为:占用了2个字

嵌入式C语言结构体_数组_02

 4、结论:

(1)把所有长度为8位的元素安排在结构体的前面

(2)依次在后面安排长度为16位、32位的元素

(3)把数组和大元素安排在后面

(4)对于一条指令,如果结构体太大而不能访问所有的元素,可以

        把元素组织成一个子结构体,编译器维持其指针。

5、使用关键字__packed,程序改写为:

__packed struct {

        char a;

        int b;

        char c;

        short d;

        }

上述结构体在内存中的布局为:占用了2个字

嵌入式C语言结构体_数组_02

armcc支持使用__packed关键字,可以不必插入填充位。适用于空间非常紧张的场合,但是运行效率非常低。

__packed关键字严重影响效率,大小端不一致也有同样的问题,采用char*可以避免该问题,因为char*在任何时候都是对齐的。