struct的内存对齐(转)

本文详细解释了结构体对齐的概念、规则及其在内存布局中的应用,通过实例展示了如何计算结构体的大小及成员的存储位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源


         

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


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


3 结构体作为成员,如果 一个 结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct b里面有struct a,a里面有char,int,double等元素,那么a应该从8的整数倍开始存储)。

          


结构体的对齐


sizeof计算一个结构体的大小时,经常得到的值比结构体内部成员所占内存总和要大,这就是因为在结构体内部,成员在存储时有对齐的规则。结构体对齐指的是  编译器向结构体插入无用内存的能力,插入无用内存使得结构体成员以最佳方式对齐,从而得到更高的效能。当基本数据类型以字节地址(几倍于自身大小)存储时,很多处理器能够获得最佳效能。

以下是几个例子:

Struct x

{

Short s;//2 bytes and 2 padding tytes

Int i; //4 bytes

Char c; //1 bytes and 3 padding bytes

};

Struct y

{

Int i; //4 bytes

Char c ; //1 bytes and 1 padding byte

Short s; //2 bytes

};

Struct z

{

Int i; //4 bytes

Short s; // 2 bytes

Char c; //1 bytes and 1 padding byte

};

Sizeof(x)=12; sizeof(y)=8; sizeof(z)=8;

X的内存布局: c

11** 1111 1***

Y的内存布局: s

1111 1* 11

Z的内存布局: c

1111 11 1*

其中*表示填充的字节,xs后面为什么 要填充两个 字节?因为i是整型,其起始位置要为4的倍数。C后面要填充3个字节,因为结构体size要为4(即最大类型 ——整型sizeof(int))的倍数。

YC后面填充一个 字节,因为sshort类型,起始位置要为2的倍数。S后面没有填充,因为cs正好占用4个字节。

Zs后面没有填充,因为sc正好占用4个字节,c填充一个字节 因为struct大小要为int的整数倍。

再看一个有结构体作为成员的例子:

Struct A

{

Int a;

Double b;

Float c;

};

Struct B

{

Char e[2];

Int f;

Double g;

Short h;

Struct A I;

};

Sizeof(A)=24; 因为 int4double8float4,总长为8 倍数,补齐,所以为24 Sizeof(B)=48;看一下B的布局

B的内存布局:i

11** 1111 11111111 11****** 1111****, 11111111, 1111****






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值