时间:2021-05-02
首先看一下结构体对齐的三个概念值:
数据类型的默认对齐值(自身对齐):
1.基本数据类型:为指定平台上基本类型的长度。如在32位机器中,char对齐值为1,short为2,int,float为4,double为8;
结构体:其数据成员中默认对齐值最大的那个值。
2.指定对齐值:#pragma pack (value)时的指定对齐值value。
3.数据类型的有效对齐值:默认对齐值和指定对齐值中小的那个值。
有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的“偏移量%N=0”。而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐排放(对于非对齐成员需要在其前面填充一些字节,保证其在对齐位置上),结构体本身也要根据自身的有效对齐值圆整(就是结构体总长度需要是结构体有效对齐值的整数倍)。
通过上面的分析,对结构体进行字节对齐,我们需要知道四个值:
及两个规则:
1.对齐规则:
offset % vaildLen = 0,其中vaildLen为有效对齐值vaildLen = min(packLen, defaultLen);
2.填充规则:
如成员变量不遵守对齐规则,则需要对其补齐;在其前面填充一些字节保证该成员对齐。需填充的字节数记为padLen:
结构体对齐算法思想:深度优先填充
先对齐内层结构体;
对每个数据成员计算其defaultLen、memberLen和offset;
再遍历每个数据成员时计算;
对于基本数据类型成员defaultLen=memberLen;对于结构体成员defaultLen等于它的所有成员的最大的memberLen;
遍历时对成员的memberLen进行累加,得到当前成员的offsetLen;
运用对齐及填充规则:在当前结构体成员前填充padLen个字节;
举例说明:
(vc6与gcc相同)
? 1 2 3 4 5 struct{ long a; short c; }A; sizeof(A) = 8;(vc6与gcc相同), 它的内存分配为: a1 a2 a3 a4 , c1 c2 x x(a1为a的第一个字节,x为补齐字节,下同)
? 1 2 3 4 5 6 7 8 9 struct{ int a; char b; short c; }A; sizeof(A) = 8;A的内存分配为:
? 1 a1 a2 a3 a4, b1 x c1 c2 ? 1 2 3 4 5 6 7 8 9 struct{ char a; int b; short c; }A1; sizeof(A1) = 12;(vc6与gcc相同)
A1的内存分配为:
? 1 a1 x x x, b1 b2 b3 b4, c1 c2 x x下面是更复杂的情况,结构体作为成员
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 struct{ int a; doubl b; short c; }A; // sizeof(A) = 24 (vc6与gcc相同) struct{ char a,b; int c; double d; short e; struct A h; }B; sizeof(B) = 48 //(vc6与gcc相同)A的内存分布:
? 1 a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x xB的内存分布:
? 1 a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
背景介绍操作系统:CentOS7.3.1611_x64gcc版本:4.8.5什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数
struct在c语言中的意思是结构体,是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。在c语言中,可以定义结构体类型,将多个相关的变量包装成为一
C++中保留了C语言的struct关键字,并且加以扩充。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct类似于class,
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类,结构体可以被声明为变量、指针或数
我们都知道,在C语言中,结构体中的字段都是可以访问的。或者说,在C++中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public