ARM硬件alignment的约束是:
1. 一次访问4字节内容,该内容的起始地址必须是4字节对齐的位置上;
2. 一次访问2字节内容,该内容的起始地址必须是2字节对齐的位置上;
3. 单字节的没有这个问题,就不用考虑啦。
特别解释一下Struct中的对齐问题:
1. 对齐的时候,编译器会为我们补充padding,从而达到对齐的要求。比如:
struct {
char a;
int b;
char c;
short d;
}
char a;
int b;
char c;
short d;
}
编译出来,内存布局是这样的:
2. 加上__packed关键字(gcc arm编译器这个关键字是__attribute__((__packed__)) ),编译器就不会为我们添加padding,从而节省内存。这样,当发生unalignment address被访问时,编译器会多生成一条汇编,从align的地址读,读到我们需要的内容结束后,再返回我们需要的值,这样做牺牲性能,保证不出错。
__packed struct {
char a;
int b;
char c;
short d;
}
char a;
int b;
char c;
short d;
}
3. 编译器不会移动struct中member的位置,来达到减少padding的目的。编译器只是挨个处理每个member,遇到需要padding的就padding。
4. 最好的编程习惯是,遇到不align的struct,自己添加一些padding,这样做有两个好处:
(1). 添加的dummy member说不定将来就可以作为一个新member,增加扩展性。
(2). 程序的可移植性好,不需要使用__packed这样的东西了。
5. Refer to <<ARM System Developer Guide>> for more details.