2016 - 2024

感恩一路有你

c语言结构体对齐规则 内存对齐的目的和规则?

浏览量:1530 时间:2021-03-10 15:31:38 作者:admin

内存对齐的目的和规则?

内存对齐原则有四个:

1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。

2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。


3).收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的"最宽基本类型成员"的整数倍.不足的要补齐.(基本类型不包括struct/class/uinon)。


4).sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。

如何理解struct的内存对齐?

C中的结构体对齐问题 结构体所占的位数要是结构体成员中所占位数最长的那个数据的整数倍,在这个结构体中 结构体所占的位数是double型的整数倍。这个结构体虽然使用了位域,但是对结果没有影响。int i 占4个字节,char j占一个字节,这俩总共要占8个字节,虽然后面的3个字节没有用。int a 本身占个4个字节,但与结构体对齐,要占8个字节。double b占8个字节。总共为8 8 8=24个字节

内存对齐的规则?

为了加快计算机的取数速度,编译器默认对内存进行字节对齐。对结构体(包括类)进行字节对齐的原则是:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internaladding);

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。structSByte1{doubled//偏移量0~7charj//偏移量8inta//偏移量12~15,由于9不能整除4,故先填充9~11}sizeof(SByte1)//=16structSByte2{charj//偏移量0doubled//偏移量8~15,由于1不能整除8,故先填充1~7inta//偏移量16~19}sizeof(SByte2)//=24,为了凑成8的倍数,填充20~23

c语言中变量存储为什么要内存对齐?

为了有助于加快计算机的取数速度,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

c语言结构体对齐规则 结构体对齐原则 struct对齐原则

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。