1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言结构体字节对齐规则

C语言结构体字节对齐规则

时间:2022-06-08 09:35:52

相关推荐

C语言结构体字节对齐规则

C语言结构体字节对齐规则

基本规则

规则1:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

规则2:如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。

Tips:

结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。不是直接将结构体A的成员直接移动到结构体B中

规则3:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

案例解析

例1

typedef struct A{int a;short b;}A;/** * 内存对齐规则:* 按最长的类型的长度为最长长度* 4*0 = 0 所以从 0 位置开始放* 2*0 = 0 0位置已经有内容* 2*1 = 2 2位置已经有内容* 2*2 = 4 4位置空,可以存放* short长度 为2 而基准长度为4,因此 需要将剩余的两字节补空* 故 A大小为8字节* a a a a* b b - - */ printf("%d\n",sizeof(A));//8

例2

typedef struct B{double a;short b;int c;}B;/** * 最长基准长度为8* 8*0 = 0 放于0位置起的8个字节* 2*0 = 0 此处有内容* ...* 2*4 = 8 此处空闲可以存放 8-10用于存放 short* 4*0 = 0 此处已经有内容* ...* 4*3 = 12 此处可以存放 12-15* a a a a a a a a* b b - - c c c c* 所以B共占用 16字节*/printf("%d\n",sizeof(B));

例3

typedef struct C{short a;double b;int c;}C;/** * 最长基准长度为:8* 2*0 = 0 0-1位置用于存放a* 8*0 = 0 此处已有内容* 8*1 = 8 8-16位置用于存放b* 4*0 = 0 此处已有内容* 4*3 = 12 12-16存放c* a a - - - - - -* b b b b b b b b* c c c c - - - -*/printf("%d\n",sizeof(C)); //24

例4

typedef struct D{int a;double b;}D;typedef struct E{short a;int b;D c;}E;/** * 当结构体内部嵌套结构体时,以两个结构体内部最长的类型为基准长度* 此处结构体D与E最长的长度为D中的double,因此基准长度为:8* 2 * 0 = 0 0-1位置存放E.a* 4 * 0 = 0 * 4 * 1 = 4 4-7位置存放E.b* 8 + 4 * 0 = 8 8-11位置存放D.a* 8 + 8 * 0 = 8* 8 + 8 * 1 = 16 16-23位置存放D.b*/printf("%d\n",sizeof(E)); //24

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。