“ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。
”。以前没有接触过这个理论,而且这句话也分怎么理解,stm32基于ARMv7架构,最严格的对齐方式是字访问的字对齐(LDM,S ...
双字对齐只是编译器处理长数据类型的一种模式,与处理器无关(比如可以1字节强制对齐),在寄存器只有4字节的情况下,编译器仍然可以以8节对齐,编译器的双字对齐在处理器级别依然是字对齐,因为双字地址必然是一个字地址。但编译器采用变量自然边界对齐后的确有助于处理器操作。
处理器层面的数据对齐和编译器层面的数据对齐不是一个概念,处理器更关注的是可否一次存取数据,或者说可否在地址总线得到正确的译码,而编译器关注的是变量的存放位置,以及汇编后的代码长度。最典型的例子就是如果编译器中不是自然边界对齐,也可以编译成汇编的,但代码长度自然会增加,而在处理器中一条语句的操作地址不是对齐的,则会发生访问错误(当然,支持非对齐访问的处理器除外)
“ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。”这句话是从ANSI标准来的,这句话是对编译器的要求,是用来规范编译器在数据对齐上的处理方法的,我前面说了这个和处理器对齐是两个概念。
我发这个帖子的目的也是让大家了解数据对齐概念在嵌入式程序设计中的重要性,至于我的观点是对是错,我觉得已经不重要了,大家可以自己试验,也会有自己的理解。