结构体字节对齐最简单的解释
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
个成员结束后,所占的内存空间大小已经是有效对齐值的
整数倍了,所以不需要再加上填充字节了。
} xy;
例 2: struct S1 { char c; int i; }; struct S3 { char c1; S1 s; char c2; };
//占 8 字节 //占 16 字节
例 3:
#pragma pack(2)
一、 字节对齐
原则:一个变量的首地址必须满足相应的字节对齐(即首地址必须是某 一个值的整数倍)。其中这个值叫做有效字节对齐值。且该变量所占的内存大 小必须是有效对齐值的整数倍。
说明:
变量有两种类型
1、 单一变量,如:char,int,double;
2、 结构体变量。(结构体里既会存在单一变量,又会存在结构体 变量)
由以上说明就可以知道一个结构体变量所占的真实字节数了。
下例中所有结构体的起始地址都假设从 0 开始
例 1:
struct a
{
char no[10]; //没有指定对齐值,所有有效对齐值为自身对齐值,即
1;所以占用地址 0--9
int p;
//没有指定对齐值,所有有效对齐值为自身对齐值,即 4;
所以占用地址 12--15
struct S1 {
char c; int i; }; struct S3 { char c1; S1 s; char c2; }; #pragma pack()
// 必须在结构体定义之前使用
//占 6 字节
//占 10 字节 // 结束
————WtYj
long int pp; //没有指定对齐值,所有有效对齐值为自身对齐值,即
4;所以占用地址 16--19
unsigned int ppp;// 没有指定对齐值,所有有效对齐值为自身对齐
值,即 4;所以占用地址 20--23
char x; //没有指定对齐值,所有有效对齐值为自身对齐值,即 1;
所以占用地址 24
float y; //没有指定对齐值,所有有效对齐值为自身对齐值,即 4;所
以占用地址 28--31
double h; //没有指定对齐值,所有有效对齐值为自身对齐值,即 8;
所以占用地址 32—39
//该结构体变量没有指定对齐值,所以有效对齐值就是这些
成员中自身对齐值中最大的一个,即 8;该结构体最后一
有效对齐值与以下两种对齐值有关
1、 自身对齐值
对于单一变量,自身对齐值就是该变量所占的内存大小。
对于结构体变量,自身对齐值就是结构体成员自身对齐值中最 大的一个。
2、 指定对齐值
用程序自定对齐值。
#pragmaFra Baidu bibliotekpack(2)
//开始
#pragma pack()
//结束
代表指定 2 字节对齐
如果没有指定对齐值,那么有效对齐值就是变量的自身对齐值;如果指 定对齐值,那么有效对齐值就是这两个对齐值中的小者。