结构体内存对齐

来源:互联网 发布:乐宝是什么软件 编辑:程序博客网 时间:2024/05/01 05:46

1.原因:为什么需要内存对齐.
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

2.内存对齐的规则和范例
讲述内存对齐之前先看下各种类型的大小,和编译器以及字长有关具体在此不多叙述.
成员的内存分配规律:从结构体的首地址开始向后依次为每个成员寻找第一个满足条件的首地址x,该条件是x % N = 0,并且整个结构的长度必须为各个成员所使用的对齐参数中最大的那个值的最小整数倍,不够就补空字节。
结构体中所有成员的对齐参数N的最大值称为结构体的对齐参数。

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值(或默认值)和这个数据成员类型长度中,比较小的那个进行。在上一个对齐后的地方开始寻找能被当前对齐数值整除的地址.
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐.主要体现在,最后一个元素对齐后,后面是否填补空字节,如果填补,填补多少.对齐将按照#pragma pack指定的数值(或默认值)和结构(或联合)最大数据成员类型长度中,比较小的那个进行。
3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员类型长度的时候,这个n值的大小将不产生任何效果。
两点注意:数组,嵌套结构体.
数组:
对齐值为:min(数组元素类型,指定对齐长度).但数组中的元素是连续存放,存放时还是按照数组实际的长度.
如char t[9],对齐长度为1,实际占用连续的9byte.然后根据下一个元素的对齐长度决定在下一个元素之前填补多少byte.

#include <stdio.h>#include<stddef.h>//内存对齐//默认的对齐数是8//linux环境的默认对齐数4struct S{int a;//4  8   4char c;// 1   8   1double d;// 8   8    8};//16struct S2{int a;//4  8   4double d;//8  8  8char c;//1   8   1struct S ss;};//24struct A{double d;//8char c;//1//1short s;//2 8 2//4double d2;//8  8   8};int main(){//printf("%d\n", sizeof(struct A));//printf("%d\n", sizeof(struct S));printf("%d\n", sizeof(struct S2));struct S s;printf("%d\n", offsetof(struct S, a));printf("%d\n", offsetof(struct S, c));printf("%d\n", offsetof(struct S, d));system("pause");return 0;}


本文出自 “顺势而为” 博客,转载请与作者联系!

0 0
原创粉丝点击