c语言内存对齐
内存对齐
什么是内存对齐?
内存对齐:在计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任何类型的变量。但实际上在访问特定类型的变量的时候需要从特定的地址开始,这就需要各种类型的数据按照一定的规则在空间上排列,而不是顺序的一个接一个的存放,这就是内存对齐,也叫字节对齐。
为什么要内存对齐?
内存对齐的作用:
- 可移植性:因为不同平台对数据的在内存中的访问规则不同,不是所有的硬件都可以访问任意地址上的数据,某些硬件平台只能在特定的地址开始访问数据。所以需要内存对齐。
- 性能原因:一般使用内存对齐可以提高CPU访问内存的效率。如32位的intel处理器通过总线访问内存数据,每个总线周期从偶地址开始访问32位的内存数据,内存数据以字节为单位存放。如果32位的数据没有存放在4字节整除的内存地址处,那么处理器需要两个总线周期对数据进行访问,显然效率下降很多;另外合理的利用字节对齐可以有效的节省存储空间。
默认内存对齐影响因素:与平台架构(位数)和编译器的默认设置有关。
结构体数据对齐
C++标准规定,int占一个机器字长。在32位系统中int占32位,也就是4个字节,而在老式的16位系统中,int占16位,即2个字节。而C++标准中只限制规定short int不能超过int的长度,具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。其中short int可以简写为short。
结构体如何处理数据对齐?
-
结构体内各个成员都要按照自身数据类型的对齐模数对齐。( G C C GCC GCC编译器默认的组大队其模数为4,超过四字节时仍按照4字节对齐。 a r m − l i n u x − g c c arm-linux-gcc arm−linux−gcc默认最大对齐字节数为8字节)
-
结构体自身的对齐模数是该结构体中最大成员的size,或者其size的整数倍。
对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:
数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
联合 :按其包含的长度最大的数据类型对齐。
结构体: 结构体中每个数据类型都要对齐,结构体整体对齐方式:按照最大成员的size或其size的整数倍对齐。
比如有如下一个结构体:
struct stu{
char sex;
int length;
char name[