结构体对齐总结

结构体对齐到底是什么,看了网上很多的解答,汇总成个人经验

在计算机内存中,结构体变量的存储通常是按字长对齐的,
比如8位机里就按字节对齐;
16位机中,变量就按照2字节对齐;
32位机中,变量就按照4字节对齐;
64位机中,变量就按照8字节对齐;

在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,虽然有一些字节是浪费掉的,但是以空间换取了更快的存取速度。

为了在时间空间上达到统一,在设计结构体的时候,把占用空间小的类型排在前面,占用空间大的类型排在后面,这样可以相对节约一些对齐空间。

什么是结构体对齐

在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,相当于是以空间换取时间

结构体对齐规则

1.第一个数据成员放在offset为0的地方;
2.结构体成员在内存中顺序存放,所占内存地址依次增高,第一个成员处在低地址处,最后一个成员处在高地址处,但结构体成员之间的内存分配不一定是连续的
3. 第二个以及以后的每个数据成员存储的起始位置,要从 N= min(sizeof(成员类型),X)的整数倍开始(比如double在32位机为8字节,则要从4的整数倍地址开始存储);
4. 整个结构体的长度必须是各成员所使用的对齐参数N中最大的那个值的整数倍
即总长度LEN= {max(N1,N2,……,N)}的最小整数倍;
5. 如果一个结构里有某些结构体成员,仍按照原来顺序规则计算,但结构体成员要从 N= min(sizeof(成员类型),X)的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素(8字节),那b应该从8的整数倍开始存储);

考虑一个问题,为什么要设计内存对齐的处理方式呢?

如果体系结构是不对齐的,成员将会一个挨一个存储,显然对齐更浪费了空间。那么为什么要使用对齐呢?体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。

ENDING

在设计结构体的时候,一般会尊照一个习惯,就是把占用空间小的类型排在前面,占用空间大的类型排在后面,这样可以相对节约一些对齐空间。\

猜你喜欢

转载自blog.csdn.net/joy2017/article/details/83578423
今日推荐