C语言结构体内存对齐规律自我总结

C语言结构体内存对齐规律自我总结-- 如果有其他学习者已有一定理解,但是对某些地方还是有些疑惑,或许可以看懂我所写---主要为了自己总结复习--如有错误方便再改


如果有其他学习者已有一定理解,但是对某些地方还是有些疑惑,或许可以看懂我所写—主要为了自己总结复习–如有错误方便再改)
前要知识:
CPU一次性能读取数据的二进制位数称为字长,一个字节=8位。
那么32位处理器可以一次性最大处理4个字节的数据量。
我们这里讨论的也是在32位计算机中,明白后可以按规律推广至64位计算机。

那么在结构体中就需要注意,
如果结构体类型中包含有某个结构体成员,它的类型所占字节数是等于4的,例如4字节的整型
那么必须保证cpu一次就能把这四个字节全部读取。即读取的时候在整型的起始地址的边界开始读取,就可以一次性确保读取4个字节成功。

设想如果,并不是在整型的边界读取数据的话, 那么它将会被分二次读取,才能读取完整这个整型所包含的所有数据。 这时候cpu还需额外的操作将分二次读取的数据整合在一起,降低了系统性能。

切入正题:(32位计算机中)

首先: 找到所在结构体所有成员当中----所占字节数最大的那个类型的成员.

例:如果最大类型成员是int(4字节) 的情况
那么需要保证永远可以在int内存起始地址边界位置读取数据
例:如果最大类型成员是int 的情况
struct temp
{
char a;
char b;
int c;
};                      
此为内存图示,  [a][b][x][x][c][c][c][c]    共占8字节           
 [x]代表内存补位;  补位以达到,cpu读取时,可以通过一次读取, 读取一个整型的所有数据.

例:如果最大类型成员是short(2字节) 的情况
那么需要保证永远可以在short内存起始地址边界位置读取数据
struct temp
{
char a;
short b;
char c;
};                      
此为内存图示,  [a][x][b][b][c][x]            共占6字节
对于结构体中最大成员类型所占是2个字节的short情况下
需注意, 对于32位计算机不是说我每次一定要读满4个字节, 是代表一次读取时可以小于等于4个字节数据. 但是不能超过4个字节的数据.
short 最大类型情况下, 那么以每次读取2个字节来判断结构体内存所占字节的标准, 也就是通过补位达到
cpu读取时,可以通过一次读取, 读取一个short的所有数据.

总结: 以结构体成员类型所占字节数最大的那个成员为判别标准, 使 cpu读取时,总是可以通过一次读取, 就读取一个该类型的所有数据.

你可能感兴趣的:(c语言,内存结构)