结构体内存对齐

原文:https://blog.csdn.net/IT_Quanwudi/article/details/80527154

 //结构体大小,存在内存对齐问题

例如:

①:我们先定义一个结构体A,并将其初始地址设为100

我们普通认为,其内存申请应该这样申请,a先申请1个字节大小空间,b再申请4个字节大小空间,结构体A 共5个字节。

如图:

而实际情况却非如此:

那我们来看看结构体真正的内存申请情况:

因为计算机读取数据时,一般标准化4个4个字节读取,所以为了节约时间,我们浪费3个字符大小的内存地址,以空间换取时间。

所以我们可以找出规律计算结构体的大小,以①为例:

②:

结构体大小:和①规则相同,②的结构体大小=(1+1)+2+4=8个字节

结构体内存申请情况:

③:

结构体大小:和①②规则相同,③的结构体大小=(1+1)+2+(1+3)+4 = 12个字节


结构体内存申请情况:

④:

结构体大小:本身按照以上规则,③的结构体大小应该=(1+3)+4+2 = 10个字节

但是运行后,结果不匹配,正确答案为12个字节

 

现在我们来看看看结构体真正的内存申请情况:


这是按照以上规则,画出来的内存图,看似没错,可结果却不是12个字节。


现在我们来考虑一下假设结构体数组的存在:


struct  E  arr[2];

这时arr[1]的地址可能会出现这种情况:


这时候计算机以标准4个4个读取时,会在第三个绿色框框处出现问题,读取失败,不是我们需要的值。

所以我们为了避免这个情况,我们会给arr[1]结尾出补上两个字符,就不会出现读取错误了。


结构体内存申请情况,如图:

这时我们回头看④:我们会发现结构体大小 =(1+3)+4+2+2 = 12个字节


我们可以找出规律计算结构体的大小时避免出现以上问题:

就是在计算出结构体大小时,用所得值对结构体内最大的成员大小取余,看是否==0;

如果!=0,我们给补上一个合适大小的内存,让取余==0 。


不过在实际工作操作时,一般会直接在结构体上补上一个空白成员并注释。

如:

最后我们总结一下结构体内存对齐的规则:

①:每一行和前面行总和比,不能被整除,则补上。

②:算出总共大小后和单个最大比,不能被整除,则补上。


我们结束前用两个结构体来验证我们的对齐规则。

①:

用对齐规则来计算:①:4+8=12 ;②:单个最大为int a或者int c都为4个字节,12%4==0。

结果正确

将上图展开,可得:

②:

用对齐规则来计算:①:8+4=12 ;②:单个最大为double a为8个字节,

12%8!=0,所以补上4个字节,(12+4)%8==0

结果为16,正确。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 例子 定义两个成员个数相同(3个成员)且成员类型相同(int、char、short)的但是成员顺序不同的两个结构体...
    owl207阅读 411评论 0 0
  • @[c++|struct] 今天在编程中碰到一个坑,搞的调试了半天,最后发现程序中在写数据和读取数据时结构体定义不...
    drybeans阅读 3,818评论 1 11
  • 转载 结构体对齐详解 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会...
    erU阅读 528评论 0 3
  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,731评论 1 22
  • 实习期间,在一次我多维棋兴趣课上配课,遇到了这样一个小孩,他是一个身穿灰色夹克的中班的小男孩,他上课不喜欢主动...
    14117雅丽阅读 310评论 0 2

友情链接更多精彩内容