结构体字节对齐、偏移量
复习下struct的大小、成员偏移量offsetof,说下我的理解:
64位下默认对齐数default=8
原则1:struct中每一个成员变量tmp的对齐数real=min{default,tmp}
struct Student {int num;//0char name[8];double score;
} stu;
这个结构体stu中,第一个成员num为int的对齐数real_num=min{8,4}=4。
第二个成员name为char类型,对齐数real_name=min{8,1}=1。
第三个成员score为double类型,对齐数real_score=min{8,8}=8。
原则2:偏移量offsetof必须是real的倍数
1,所以第一个成员num偏移量startid=0*real_num=0*4=0,从startid开始size1=4即4个bytes被用掉即[id=0~3已用]。
2,因为上面size1=4已用4个bytes。第二个成员name偏移量是startid=real_name*倍数=1*倍数>3,故此时倍数取4,所以偏移量startid=4,而name的size2=8,所以id=4~11已用。
3,因为上面size1+size2=12已用12个bytes。而第三个成员score的偏移量startid=real_score*倍数=8*倍数,必需>11,所以倍数不能取0或1,只能取2,所以startid=8*2=16,即从16开始放score,而score的大小size3=8,此时id=16~23已用。所以stu这个结构体在内存中就是如下的样子:
所以stu的size等于id=0一直到id=23即size=24。所以逻辑是先计算偏移量,再自然计算得到struct整体的大小。
struct Test1 {int x;double y;
} t1;
struct Test2 {int x;char y[8];
} t2;
在t1中,对x来说 real_x=min{8,4}=4 偏移量startid=real_x*倍数=4*0=0,size1=4,id=0~3被使用。
在t1中,对y来说 real_y=min{8,8}=8偏移量startid=real_y*倍数=8*倍数,同时必需>3,所以倍数就是1,startid=8。
当你换成char y[8]后,如结构体t2所示:对y来说,real_y=min{8,1}=1 偏移量startid=real_y*倍数=1*倍数,同时必需>3,所以倍数就是4,startid=4。
由此可见,t1和t2偏移量不一样,所以struct的size是不一样的。虽然它们的成员变量都是4bytes、8bytes,但终究偏移量不同导致了结构体大小的不同。
原则3:struct的对齐数等于其所有成员real对齐数的最大值。
所以对于结构体嵌套结构体的情况,我们易知:
struct Student {int num;char name[8];double score;
};struct CombineStudent {short memb;Student originstruct[2];char lastmem[3];
} comstu;
现在结构体Student(由之前分析知结构体的size为24字节)作为新结构体comstu的成员,且个数为2的数组originstruct。
根据原则3,结构体Student的对齐数real_stu=max(real_num,real_name,real_score)=max(4,1,8)=8
对于结构体comstu:
1,第一个成员memb为short的对齐数real_mem=min{8,2}=2。偏移量startid=0*real_mem=0*2=0 而short占2字节即[id=0~1已用]。
2,第二个成员originstruct为Student类型,对齐数real_originstruct=min{8,8}=8,偏移量startid=倍数*real_originstruct=倍数*8,必须>1,故倍数=1,即偏移量startid=1*8=8。而每个Student占24字节现在有2个Student即[id=8~8+24*2-1也就是8~55已用]。
3,第三个成员lastmem为char类型,对齐数real_lastmem=min{8,1}=1,偏移量startid=倍数*real_lastmem=倍数*1,必须>55,故倍数取56即可,startid=56,而每个char占1字节现在共3个,共id=56~58已用。
但你以为结构体comstu的大小就是id=0~58=59吗?!天真,还有原则4!
原则4:结构体的总大小size必须是对齐数real的整数倍
所以虽然上面的结构体comstu的id=0~58=59,但结构体CombineStudent的real_comstu=max(real_memb,real_originstruct,real_lastmem)=max(2,8,1)=8!但是我们之前算好的59并不是real_comstu的整数倍!所以后面必须要补几位直到占到id=63,即id=0~63总size=64才是CombineStudent的大小!
所以大家这下明白为啥C++建议我们定义变量时按从一定的顺序去定,如换个位置:
struct Combine2Student {short memb;char lastmem[3];Student originstruct[2];
} ;
刚刚的结构体CombineStudent如果换成这样,结果就不一样了,可以节约内存。大家可以算算:
real_memb=min{8,2}=2,size1=2,startid=0是real_memb的倍数,占id=0~1;
real_lastmem=min{8,1}=1,size2=3,startid=2是real_lastmem的倍数,占id=2~4;
real_originstruct=min{8,8}=8,size3=24*2=48,startid=8是real_originstruct的倍数,占id=8~55;
算到这里,总id=0~55=56已经是real_Combine2Student=max(real_memb,real_lastmem,real_originstruct)=max(2,8,1)=8的倍数了,所以不需再补!所以结构体Combine2Student的size=56!
调换位置后命名相同的三个成员,但结构体Combine2Student就是比ComebineStudent占内存少!!!
相关文章:
结构体字节对齐、偏移量
复习下struct的大小、成员偏移量offsetof,说下我的理解: 64位下默认对齐数default8原则1:struct中每一个成员变量tmp的对齐数realmin{default,tmp} struct Student {int num;//0char name[8];double score; } stu; 这个结构体stu中&#x…...
全网最全——Java 数据类型
一、数据类型方法论 程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作为抽象的概念,天然的包含2个方面属性: 类型:类型决定了数据只能和同类型的数据进行…...
数据结构基础之动态数组
目录 前言 1、Java中的数组 2、实现动态数组 2.1、基本类结构设计 2.2、添加元素 2.3、查询&修改元素 2.4、包含&搜索&删除 2.5、数组扩容 前言 今天我们来学习一下关于数据结构的一些基础知识,数据结构研究的是数据如何在计算机中进行组织和存…...
【跟我一起读《视觉惯性SLAM理论与源码解析》】第九章 地图点、关键帧以及图结构
这一章主要讲了一些基本内容,包括ORB-SLAM2中地图点,关键帧图结构的问题 地图点和特征点的关系?有时候地图点对应不同帧上的特征点,特征点可以通过三角化得到地图点地图点的几个属性,平均观测方向,以及观测…...
网络安全——数据链路层安全协议(2)
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.局域网数据链路层安全协议 1.IEEE 802.10 (1)IEE…...
【华为OD机试模拟题】用 C++ 实现 - 热点网络统计(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明热点网络统计【华为OD机试模拟题】题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出…...
人工智能学习07--pytorch09--LeNet
参考: 视频: https://www.bilibili.com/video/BV187411T7Ye/?spm_id_from333.999.0.0&vd_sourceb425cf6a88c74ab02b3939ca66be1c0d 博客:https://blog.csdn.net/STATEABC/article/details/123661612?utm_mediumdistribute.pc_feed_404.…...
java泛型编程初识
java泛型编程初识1.泛型解决的是什么问题2.泛型实例化语句3.自定义泛型1)自定义泛型类或接口2)自定义泛型方法4.泛型使用中的继承和通配1)通配2)继承使用限制1.泛型解决的是什么问题 很多类、接口、方法中逻辑相同,只是操作的对象类型不同,这个时候就可…...
代码随想录算法训练营 || 贪心算法 1005 134 135
Day291005.K次取反后最大化的数组和力扣题目链接给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)以这种方…...
Spring框架面试题
springboot的自动装配原理 主类上的SpringBootApplication存在EnableAutoConfiguration,EnableAutoConfiguration会导入AutoConfigurationImportSelector组件,其AutoConfigurationImportSelector$AutoConfigurationGroup#process()方法会读取当前应用所有…...
纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行
AP的32位保护模式代码的后半部分从0x8001C000开始执行,完成的工作主要有:初始化必要的中断给BSP发送启动成功的消息创建各AP的系统进程创建各AP的用户进程循环显示各AP中用户进程执行的时间比例5.1 初始化中断5.1.1总体初始化各AP调用init_interrupt_fun…...
2023年全国最新高校辅导员精选真题及答案7
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 71.在北京曾经发现一处战国时期的遗址,从中出土了燕、韩、赵、魏等国铸币3876…...
使用windwow windbg 吃透64位分页内存管理
前言 分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。 具体可以参阅intel volume3的 4.1.1 Four Paging Modes章节。 简而言之:CR0.PG 0表示不开启分页.并且根据CR4各种标志开启不同类别的…...
Java知识复习(五)JVM虚拟机
1、虚拟机的自动内存管理和C/C的区别 C/C开发程序时需要为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和溢出问题。而Java程序将内存控制权交给了Java虚拟机 2、JVM的运行机制 1、Java程序的具体运行过程如下: Java源文件被编译器编…...
房屋出租管理系统
1. 铺垫 1.1 项目真实开发的过程 上来要做什么???? 有电脑—》配环境(JDK、IDEA、MAVEN……) 这个项目:房屋管理系统 从什么角度出发,第一步做什么?? 架构 …...
2023年全国最新食品安全管理员精选真题及答案6
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 51.制定《中华人民共和国食品安全法》的目的是为了保证食品安全…...
C++中的文件操作
文件操作 所有数据程序运行结束后都会释放通过文件可以将数据持久化头文件文件类型分为两种 文本文件—文件以文本的ASCII码形式存储在计算机中二进制文件—文件以文本的二进制存储在计算机中 操作文件的三大类 ofstream—写操作ifstream—读操作fstream—读写操作 文本文件 写…...
监控生产环境中的机器学习模型
简介 一旦您将机器学习模型部署到生产环境中,很快就会发现工作还没有结束。 在许多方面,旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期?下周/月/年,当客户(或欺诈者)行为发生变化并且您的训练…...
15s了解什么是物联网技术
目录 15s了解什么是物联网技术 15s了解什么是物联网技术 什么是物联网技术。 简单地说,物联网就是把所有的物体连接起来,相互作用,形成一个互联互通的网络,这就是物联网。如果说互联网是我们身体的虚拟大脑,那么物联网就是我们身体的感知系统,就像眼睛和耳朵-样,让我们…...
敲出来的真理-mysql备份大全,备份命令,还原命令,定时备份
mysqldump命令全量备份数据全量标准语句格式mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构(加 -d 参数&#x…...
ATTCK实战系列-红队评估(一)
from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机,其他都只设置成仅主机模式 windows 7添加两个网卡,一个是仅主机,一个是NAT …...
学python的第二天---差分
一、改变数组元素(差分)方法一:差分数组map(int,input().split())for b in arr[:n]:print(1 if b else 0,end )方法二:区间合并interval.sort(keylambda x:x[0])二、差分a [0] list(map(int, input().split())) a[n 1:]三、差…...
数据结构入门5-2(数和二叉树)
目录 注: 树的存储结构 1. 双亲表示法 2. 孩子表示法 3. 重要:孩子兄弟法(二叉树表示法) 森林与二叉树的转换 树和森林的遍历 1. 树的遍历 2. 森林的遍历 哈夫曼树及其应用 基本概念 哈夫曼树的构造算法 1. 构造过程 …...
把Redis当作队列来用,到底合适吗?
文章目录 前言从最简单的开始:List 队列发布/订阅模型:Pub/Sub趋于成熟的队列:Stream1) Stream 是否支持「阻塞式」拉取消息?2) Stream 是否支持发布 / 订阅模式?3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?…...
Python学习-----项目设计1.0(设计思维和ATM环境搭建)
目录 前言: 项目开发流程 MVC设计模式 什么是MVC设计模式? ATM项目要求 ATM项目的环境搭建 前言: 我个人学习Python大概也有一个月了,在这一个月中我发布了许多关于Python的文章,建立了一个Python学习起步的专栏…...
(九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取
系列文章目录 (1)python网络爬虫—快速入门(理论+实战)(一) (2)python网络爬虫—快速入门(理论+实战)(二) (3) python网络爬虫—快速入门(理论+实战)(三) (4)python网络爬虫—快速入门(理论+实战)(四) (5)...
数据分析面试、笔试题汇总+解析(六)
(接上篇) 面试题(MySQL篇) 3. 如何提高MySQL的查询速度? 考点解析: 考察面试者对MySQL查询优化的理解 参考答案: (因为这个问题如果回答的详细一点可以写上一整篇,…...
vue3+rust个人博客建站日记3-编写主页
内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力,又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI,NaivUI库曾被Vue框架作者尤雨溪推荐…...
前端常考react面试题(持续更新中)
react diff 算法 我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法 diff算法的作用 计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而…...
C++11多线程编程 二:多线程通信,同步,锁
C11多线程编程 一:多线程概述 C11多线程编程 二:多线程通信,同步,锁 C11多线程编程 三:锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明: 初始化(Init)&am…...
专做服装的网站/网络推广公司服务内容
Win10系统已经跟大家见面3年左右了,越来越多的用户在当初充满质疑的争论中慢慢接受了,在使用的过程中难免会出现这样那样的问题,我们知道,win10系统本身就比较大,会占用一部分内存空间,再加上平时是用的过程…...
家电网站建设/免费b站推广网站入口202
x4bx2c0有四个根a1,a2,a3,a4x^4bx^2c0有四个根a_1,a_2,a_3,a_4x4bx2c0有四个根a1,a2,a3,a4 Q条件or关系FQ(a,b){a1a20a3a40\begin{cases}a_1a_20& \text{}\\a_3a_40& \text{}\end{cases}{a1a20a3a40保持上述关系不变的置换有8个F1F(b2−4c)F1F(\s…...
网站开发时保证用户登陆的安全/百度快速排名工具
HANA 语法什么的看这里,懒得写博客了 HANA语法参考:SAP HANA Reference 分类数据类型日期时间类型( Date time)DATE, TIME, SECONDDATE, TIMESTAMP数字类型( Numeric)TINYINT, SMALLINT, INTEGER, BIGINT, SMALLDECIMAL,DECIMAL, REAL, DO…...
如何做网站访百度联盟/网站快速排名互点软件
在Stata/SE 16.0中,您可以使用以下命令将dta格式数据存储为Excel: export excel using filename.xlsx, replace其中,filename.xlsx是要存储的Excel文件的名称,replace选项指示如果该文件已经存在,则将其替换。 请注意&…...
环保网站建设/北京网站建设公司报价
使用mybatis标签规避空where一、where标签案例1、原始sql2、简单if标签判断是否为空3、使用where标签后逻辑代码二、Select注解中当参数为空则不添加该参数的判断一、where标签案例 List<FilterUsersListQueryResDTO> filterUsers(Param("filterUsersQueryDTO"…...
什么叫网站建设方案书/中国疫情最新数据
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby。是一种分布式数据一致性的解决方案。一、zookeeper的特性顺序一致性 从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中。原子性 所有的事务请求…...