结构体大小的计算方法
结构体大小的计算需同时满足以下几点
一、结构体成员的偏移量必须是当前成员大小的整数倍。(0是任何数的整数倍)
举一个例子
struct Test1{char a; // 当前偏移量为0,是char所占字节数1的整数倍 所以所占大小为1char b; //当前偏移量为1 是char所占字节数1的整数倍 所以所占大小为1char c; //当前偏移量为2,是char所占字节数的整数倍 所以所占大小为1int tmp; //当前偏移量为3,不是int(默认为4个字节)所占字节数的整数倍 // 所以偏移量要加1变成4 所以所占大小为4+1 // 一共加起来为 8
};
在windows执行sizeof(struct Test1)结果确实为8
再看下面一个例子
struct Test2{char a; //1int tmp; // 4+3 偏移量为1不是int型的整数倍所以要加3char b; //1 偏移量为2是char型的整数倍 所以无需加
};
如果用上面的方法得到的结果为9 ,但在调用sizeof(struct Test2)后结果却为12,这是为何?
是因为还要满足:
二、结构体的大小必须满足所有成员(不考虑数组和内套结构体)的整数倍
接着看上面的Test2例子,通过性质一得到结果9,然后将9一一和结构体的成员进行比对:
9是结构体第一个成员a(char)所占字节的整数倍没问题,9是结构体第二个成员tmp(int)所占大小的整数倍吗?显然不是,int在此编译器下默认占4个字节,所以9要加3变为12,这就满足了性质二。 继续 ,12是结构体的第三个成员b(char)所占字节的整数倍 所以最后结果应为12。
再看一个结构体的成员包含数组的例子
struct Test3{char a; // 1int tmp; // 4+3 偏移量为1不是int型的整数倍所以要加3char str[8]; // 8 有8个元素,所以占8个字节
};
调用sizeof(struct Test3)的结果为16,注意最后的结果不考虑结构体成员中数组大小的整数倍
如果结构体里内套结构体呢?
接着看例子
struct Test4{char a; // 1int tmp; // 4+3 偏移量为1不是int型的整数倍所以要加3struct B{ // 8char c; // 1int b; // 4+3 偏移量为1不是int型的整数倍所以要加3};float e; //4
};
对于内套的结构体,先整体计算内套的这个结构体大小,然后在加上外部的成员大小。最后调用sizeof(struct Test4)的结果为20,同上注意最后的结果不考虑结构体成员中内套整个结构体大小的整数倍。
注:有的编译器不计入未实例化结构体的大小。如例子Test4中的内套结构体struct B 未实例化对象,结果为:12,不计入内套结构体的大小,若要计入,就应实例化结构体如:
struct Test4{char a; // 1int tmp; // 4+3 偏移量为1不是int型的整数倍所以要加3struct B{ // 8char c; // 1int b; // 4+3 偏移量为1不是int型的整数倍所以要加3}test; //实例化结构体float e; //4
};
后面的联合体就不一一介绍了。
结构体大小的计算方法相关推荐
- C语言结构体大小;结构体嵌套结构体大小的计算方法分析
C语言结构体大小:结构体嵌套结构体大小的计算方法分析! 在了解结构体大小如何计算之前,我们首先得了解结构体的对齐规则: 第一个成员在与结构体变量偏移量为0的地址处: 其他成员变量要对齐到某个数字(对齐 ...
- 面试必问: 结构体大小的计算方法
结构体大小的计算需同时满足以下几点 一.结构体成员的偏移量必须是当前成员大小的整数倍.(0是任何数的整数倍) 举一个例子 struct Test1{char a; // 当前偏移量为0 ...
- c语言 struct结构体大小计算方法
struct结构体大小的计算方法 1)第一个成员处在偏移地址0的地方 2)每个成员按其类型大小和pack参数中较小(编译器默认#pragma pack(4) 4字节对齐)的一个进行对齐 偏移地址必须能 ...
- 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法
结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...
- 结构体大小之嵌套结构体的长度计算
计算嵌套结构体的长度需要掌握一般结构体的计算方法,这篇文章是我看的中写的不错的,但是他嵌套结构体的计算写的不太好,在他的基础上进行一些改进: https://blog.csdn.net/qq_1932 ...
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...
- 【转】彻底搞清计算结构体大小和数据对齐原则
数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...
- C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
1.问题 1).结构体大小 结构体成员的内存分配满足下面三个条件 2 结构体第一个成员的地址和结构体的首地址相同 3 结构体每个成员地址相对于结构体首地址的偏移量是该成员大小的整数倍,如果不是 ...
- Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...
在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项 /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令 #pragma pack ...
最新文章
- Linux安装图解全过程(Linux Text文本界面安装)
- Nature好文:过去150年,科学与产业经历四段情缘!
- 用python+flask自己制作api(教程附源码)
- JVM实战与原理---类加载机制
- [Java基础]List集合子类特点
- oracle的口令就是密码吗,如何修改Oracle用户的密码(不改变原密码)
- Jstatd命令 Java Statistics Monitoring Daemon
- Diango 框架起步
- 网页游戏为什么容易赚钱?(From:07073)
- idea里查找maven的jar包冲突
- 解决办法:error: ‘unordered_map’ in namespace ‘std’ does not name a template type
- JAVA 实验报告总结
- TOGAF架构体系材料
- 2007年度全世界最好的50个网站
- oracle cube语法,oracle Rollup 和 Cube用法
- Unity导弹,射击
- 基于深度学习的移动网络异常检测
- Java算法:LeetCode算法Java版合集1111-1588题
- 2021年职业病防治法宣传周宣传资料
- 达人评测 惠普暗影精灵8和惠普暗影精灵8plus的区别
热门文章
- ESP32 学习日志(4)——OTA升级(1)-示例解析
- pythonmatplotlib怎么画阴影_python – 在matplotlib的极地阴影阴影细胞
- 带保护装置的水塔自动进水装置
- echarts折线图动态修改折线颜色
- stm32之中断模式
- multipartfile获取数据_MultipartFile实现文件上传
- 编写程序,输入一个3位整数,反转后输出。
- 上海大学计算机学研好找工作吗,上海大学算好的211吗?上海大学出来好找工作吗?...
- 怎样使网页页面变黑白
- matlab 语音信号采集,MATLAB语音信号采集与处理.doc