结构体字节对齐/瑞萨CA78K0编译器结构体对齐规则

结构体字节对齐
一、瑞萨CA78K0R编译器中
瑞萨CA78K0R编译器中默认结构体以2字节方式对齐。改变编译器设置Compile Options -> Data Control -> Pack Structure Members为 Yes(-rc),如图1。可以调整为1字节对齐,即结构体内部连续,不会存在填充区。在IDE的help中可找到证明,如图2。但是改变此设置只对结构体生效,对其他变量类型无效。
图1 瑞萨编译器选项设置编译器设置
图2 help中关于结构体对齐的说明 图1 help中的描述

实测如下:	
1. 当没有关闭内存对齐时:定义结构体
	(1)如果只有一个u8类型的变量,不会填充;
	(2)当定义大于1个的奇数个u8类型的变量,编译器会填充剩下的一个 字节区域,保证内存大小是2的倍数;
	(3)定义其他类型情况如上第2条。
2. 关闭内存对齐之后
	使用sizeof()函数测得结构体的大小即为各个成员大小之和,不会出现填充区。但是内存访问结构体的速度会下降。

二、关于结构体内存字节对齐
结构体会有字节对齐是为了提高访问的效率,一般情况下遵循以下三种规则(查资料可得):
(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
(2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
(3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
根据上述规则,可推测访问结构体成员的基本单元时最宽基本类型的大小,比如成员类型最宽为4个字节,结构体的大小就是4的倍数。所以需要依据以上规则编排成员的顺序,减少不必要的填充区的出现,提高内存的利用率。当然字节对齐的个数的可以由程序员自己设定。
参考资料:

  1. https://www.cnblogs.com/luxiaoxun/archive/2012/11/09/2762438.html
  2. https://mp.weixin.qq.com/s?src=11&timestamp=1584668527&ver=2227&signature=fauI0AXWyr0BSdH45DDXaKlGaZoUXH3UgTf8oHmA3ZpUrVKnbtNIyemqmPiMfSVKzXjxeOA1tQvqXLYIutQLw0P-dUIc8yc3KjVnZ63yIUVD5LEGxxam-BwsGSxocT2y&new=1

猜你喜欢

转载自blog.csdn.net/qq_36439722/article/details/105071682
今日推荐