结构体的大小该如何计算?
1. 第一个成员在与结构体变量偏移量为 0 的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 。VS 中默认的值为 83. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
struct S1
{char c1;int i;char c2;
};
拿上图结构体举例,我们可以画图表示
第一个成员在与结构体变量偏移量为0的地址处。
可以画一个内存,标号从0开始。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
例如结构体S1中的char c1,char类型占1个字节,所以占用标号为0的地址处。
再来看第二个成员int,整型占4个字节,而且要对其到对齐数的整数倍的地址处 。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
在vs环境下 默认对齐数为8,而整型为4,所以要对齐到4的倍数地址处,即:
再看第三个成员,又是char类型,而下一地址处的标号为8,就是1的倍数,所以char c2就占标号为8的地址处。
当所有成员占完后, 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
该结构体的最大对齐数为4,当前结构体占了9个字节,不是4的倍数,所以继续往下占用内存空间,直到总大小是4的倍数。
到此为止,该结构体的总大小就知道了,是12。
struct S2
{char c1;char c2;int i;
};
根据上述方法,可知该结构体的大小为8。
故得出结论,结构体的大小还和成员顺序有关。
struct S3
{char c1;struct S2 s2;double d;
};
当遇到结构体里嵌套结构体时
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
意思就是说,结构体成员里有结构体时,嵌套的结构体的对齐数是该结构体成员里最大的对齐数。struct s2的大小为8,struct s2的成员里,最大对齐数是整型,即4。
所以计算struct s3时,方法不变,依然先是画出一块内存,标号从0开始,其次开始对齐各成员,故如图所示
目前该结构体共占24个字节,最大对齐数是8,24是8的倍数,故该结构体的大小为24。
以上就是如何计算结构体大小的方法,如有不足之处请各位大佬批评指正,欢迎交流!!
结构体的大小该如何计算?相关推荐
- C语言 如何计算结构体的大小
无嵌套结构体的大小计算 如何计算结构体的大小? 由于存储变量地址对齐的问题,计算结构体大小的3条规则: 1.结构体变量的首地址,必须是结构体变量中的"最大基本数据类型成员所占字节数" ...
- 详细解释如何计算一个结构体的大小?
其他: 1.数组下标可为负:a[-1] 相当于 a+(-1); 2.联合体大小就是成员中最大类型的大小: 如何计算一个结构体的大小? 例如: struct Test{ int Num; char ...
- 结构体的大小如何计算?
看了一些博客上关于结构体计算的讲法,有些没讲全面,有些根本就是错误的,可能作者本人都没意识到自己错了,我总结一下加深印象. 查看全文 http://www.taodudu.cc/news/show-7 ...
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...
- 结构体的大小如何计算
我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体.而结构体的大小也不是成员类型大小的简单相加.需要考虑到系统在存储结构体变量时的地址对齐问题. 由于存储变量地址对齐的问题,结构体大小计 ...
- 如何计算结构体的大小(四步轻松解决)
我们都知道,利用sizeof可以直接计算得出,那么具体是如何得出这些答案的呢,我将通过代码和四步规则法结合来做演示,如下述代码所示: #include<stdio.h> typedef s ...
- C语言sizeof求结构体的大小
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4.基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小. ...
- 结构体PLUS(计算结构体类型大小及位段)~~
如何计算结构体类型大小呢? 1. 结构体内存对齐 为什么要内存对齐呢? 2.修改默认对齐数 3.位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 关于结构体类型,之前阿涛写过一篇文章,里 ...
- sizeof()计算结构体的大小
原文链接:sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算 简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大 ...
最新文章
- Android 监听多个Spinner 的点击事件
- 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
- Warning: Link to vtkInteractionStyle for default style selection的解决办法
- c语言dynamic变量,C# dynamic关键字的使用方法
- CodeSmith--SchemaExplorer类结构详细介绍
- docker运行jenkins挂掉_【图文】Jenkins教程集成SonarQube
- C语言 数组遍历 - C语言零基础入门教程
- 由已有数组创建新数组:concat()splice()方法
- so文件动态加载注意事项
- 浅析局域网与广域网中数据传输
- HDU 5348 MZL's endless loop(DFS去奇数度点+欧拉回路)
- java text to speech_java - 无法使用“ TextToSpeech.speak()”方法 - 堆栈内存溢出
- django models 数据库 update_or_create 更新或者插入
- 你连阶级固化的原因都搞不清,又凭什么不被固化在底层?
- 程序员必看:7个接外包私活网站
- 使用 maven 打包 src/test/java下的文件,并用 java jar 跑打包出来的jar
- fatal: Couldn't find remote ref refs/heads/cm-13.0
- python中forward的参数_ip_forward参数对Linux内核转发影响分析
- 名帖337 张旭 草书《古诗四帖》
- “第一股”争夺战:每日优鲜、叮咚买菜及美菜网谁能杀出重围?
热门文章
- 好程序员Python培训分享Python系列之分支结构
- 利用计算机解决问题的原理方法是什么,2021安徽省中小学教师招聘中学信息技术笔试大纲...
- 表格属性cellspacing、cellpadding
- .NET图表控件TeeChart for .NET使用教程:图例设计
- BigPipe facebook
- 寻找输入数字中的全数字
- 解决Google Chrome 网页加载速度变慢
- chatGPT流式回复是怎么实现的
- 浅谈 MySQL 新的身份验证插件 caching_sha2_password
- 北美“居家令”一再延期,回国机票天价难求,今年我该何去何从?