计算结构体大小
计算结构体大小
目录
- 计算结构体大小
- 一. 结构体内存对齐
- 1. 简介
- 2. 嵌套结构体
- 二. offsetof
- 三. 内存对齐的意义
- 四. 修改默认对齐数
一. 结构体内存对齐
以字节(bety)为单位
1. 简介
对于结构体成员在内存里的存储,存在结构体的对齐规则,并不是连续存放的。
例1:对下面程序,你认为结构体s的大小是多少呢?
#include <stdio.h>struct S1
{char a;int b;char c;
};int main()
{struct S1 s;printf("%d\n", sizeof(s));return 0;
}
-
第一个成员存放的位置是该结构体偏移量为0的地址

-
其他成员变量需要根据偏移量存放在其对齐数的整数倍的位置处
vs 下:对齐数 = 编译器默认对齐数(值为8) 与 该成员变量大小的最小值
(Linux下: 对齐数 = 该成员变量的大小)

- 结构体总大小是其每个成员对齐数中最大数值的整数倍

2. 嵌套结构体
例2: 对下面代码中,结构体s的大小是?
#include <stdio.h>struct S1
{char a;int b;char c;
};struct S2
{struct S1 s1;char c;
};int main()
{struct S2 s;printf("%d\n", sizeof(s));return 0;
}
- 包含上述三条规则下,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体总大小为最大对齐数(包含嵌套结构体成员的对齐数)的整数倍

二. offsetof

- 该宏可以用于计算结果体成员相对于起始位置的偏移量
示例:

-
原码解析
#define offsetof(s,m) ((size_t)&(((s*)0)->m))
将数字0(地址为0x00000000)强转为
s*类型的数据,s是结构体,m是其成员,通过
&((s* )0->m)得到成员m处的地址,再转换为size_t类型数据(相当于得到m地址距离结构体起始地址0x00000000的偏移字节数)。
三. 内存对齐的意义
- 在不同平台下,不是所有硬件平台都可以取任意地址访问数据,某些平台只能在某些地址处取特点大小的数据。
- 此时对于内存对齐后的数据,处理器访问会更加便捷
示例:

结构体内存对齐为了用空间来换取时间
但是我们可以利用结构体内存对齐规则,更合理的设计成员变量位置,如:让占用空间小的成员放在一起。
四. 修改默认对齐数
在vs(Visual Studio)编译器下存在默认对齐数(8)
如果我们想要修改为其他数值,也是可以的。
使用预处理指令#pragma pack(数字),修改成你想要的结果
示例:

将默认对齐数调至2后,对于结构体
s1:a在偏移量0的空间,b在偏移量2~5的空间,c在偏移量6的空间。从0 ~ 6一共7个字节的空间,不是最大对齐数2的整数倍,所有会再浪费1个字节空间,总大小为8个字节。
通常修改的默认对齐数都是2n2^n2n , n=(0,1,2...)n=(0,1,2...)n=(0,1,2...) 。
s1:a在偏移量0的空间,b在偏移量2~5的空间,c在偏移量6的空间。从0 ~ 6一共7个字节的空间,不是最大对齐数2的整数倍,所有会再浪费1个字节空间,总大小为8个字节。
通常修改的默认对齐数都是2n2^n2n , n=(0,1,2...)n=(0,1,2...)n=(0,1,2...)
🦀🦀观看~
相关文章:
计算结构体大小
计算结构体大小 目录计算结构体大小一. 结构体内存对齐1. 简介2. 嵌套结构体二. offsetof三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节(bety)为单位 1. 简介 对于结构体成员在内存里的存储,存在结构体的对齐规则&#…...
第二十一篇 数据增强
文章目录 摘要1、数据增强的作用2、常用的图像增强方法2.1、一些辅助函数ToTensorToPILImageNormalizeResize2.2、中心裁剪2.3、亮度、对比度和颜色的变化2.4、随机裁剪2.5、随机灰度与灰度2.6、水平/竖直翻转2.6.1、水平翻转2.6.2、垂直旋转2.7、随机角度旋转2.8、随机仿射变换…...
记一次线上es慢查询导致的服务不可用
现象 某日线上业务同学反馈订单列表查询页面一直loding,然后提示请求超时,几分钟之后恢复正常 接到报障之后,马上根据接口URL,定位到了请求链路,发现是es查询超时,这里我们的业务订单表数据是由几百万的&a…...
分布式之ZAB协议
写在前面 假定我们现在使用zk执行了如下的指令: [zk: 192.168.0.10:2181(CONNECTED) 0] create /dongshidaddy 123 Created /dongshidaddy [zk: 192.168.0.10:2181(CONNECTED) 1] create /dongshidaddy/mongo 456 Created /dongshidaddy/mongo假定因为节点故障最终…...
MySQL binlog常用命令及设置清理时间
MySQL binlog常用命令及设置清理时间1 binlog 基本概念2 binlog常用命令3 清理MySQL的binlog日志3.1 自动清理3.2 手动清理文章参考: http://www.360doc.com/content/22/0418/08/65840191_1027038859.shtml https://www.cnblogs.com/kiko2014551511/p/11532426.html…...
Windows下载安装Prometheus
目录 资料 下载 解压 点击prometheus.exe运行 资料 Prometheus是一个开源的系统监控和报警系统,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。 官网:https://pr…...
0-1背包、完全背包及其变形【零神基础精讲】
来源0x3f:https://space.bilibili.com/206214 三叶姐的对背包问题的总结:【宫水三叶】详解完全背包一维空间优化推导(附背包问题攻略)https://leetcode.cn/circle/discuss/GWpXCM/ 文章目录0-1背包、完全背包及其拓展(…...
OpenStack
OpenStack优势: 1、模块松耦合。 2、组件配置较为灵活。 3、二次开发容易 OpenStack共享服务组件: 1、数据库服务:MongoDB 2、消息列队:RabbitMQ 3、缓存:Redis 4、存储:Ceph 5、负载均衡ÿ…...
Spring Boot整合Kaptcha实现验证码功能
目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha,创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回3 登录时从sess…...
【2023】某python语言程序设计跟学第一周内容
本文说明: 案例内容为北理工python语言程序设计课程,如有不妥请联系! 目录温度转换案例:执行结果:代码解析:白话说明:举一反三:根据输入半径求圆周长或面积执行结果:温度…...
C#学习记录——接口的实现
一小部分知识精英依旧直面核心困难,努力地进行深度钻研,生产内容;而大多数信息受众始终在享受轻度学习,消费内容。如果我们真的希望在时代潮流中占据一席之地,那就应该尽早抛弃轻松学习的幻想,锤炼深度学习…...
“ChatGPT之父”Sam Altman:我是如何成功的?
背靠微软,OpenAI能拳打谷歌,脚踢Meta,它背后的男人,必然不简单。 让我们来看一看,Sam Altman是如何一步步成长为今天这个搅动全世界的男人。 山姆奥特曼(Sam Altman) 成长和创业经历 在YC创始…...
jQuery发送Ajax请求的几种方式
概述JQuery发送ajax请求的方法有很多,其中最基本的方法是$.ajax,在其中封装的方法有 $.get, $post等。我们分别举了不同的示例。数据格式首先,浏览器与服务器之间传输数据所采用的格式,比较常见的有json,jsonp…...
Android实现连线题效果
效果图全部正确:有对有错:结果展示,纯黑色:支持图片:实现思路仔细分析可以发现,连线题的布局可以分为两部分,一个是左右两列矩形,另一个是他们之间的连线。每个矩形的宽高都一样&…...
以数据 见未来!首届未来数商大会成功举办
2月25日,2023未来数商大会在杭州未来科技城学术交流中心举办。大会发布了数商产业趋势研究报告,首次提出并探讨了完整的数商产业概念,并成立了未来数商联盟,开通了浙江大数据交易服务平台余杭专区。会上,杭州未来科技城…...
Java数据结构与算法——手撕LRULFU算法
LRU算法 力扣146:https://leetcode-cn.com/problems/lru-cache/ 讲解视频:https://www.bilibili.com/video/BV1Hy4y1B78T?p65&vd_source6f347f8ae76e7f507cf6d661537966e8 LRU是Least Recently Used的缩写,是一种常用的页面置换算法&…...
20230227英语学习
Can Clay Capture Carbon Dioxide? 低碳新思路:粘土也能吸收二氧化碳! The atmospheric level of carbon dioxide — a gas that is great at trapping heat, contributing to climate change — is almost double what it was prior to the Industria…...
校招前端高频react面试题合集
了解redux吗? redux 是一个应用数据流框架,主要解决了组件之间状态共享问题,原理是集中式管理,主要有三个核心方法:action store reduce 工作流程 view 调用store的dispatch 接受action传入的store,reduce…...
k8s node之间是如何通信的?
承接上文同一个node中pod之间如何通信?单一Pod上的容器是怎么共享网络命名空间的?每个node上的pod ip和cni0网桥ip和flannel ip都是在同一个网段10.1.71.x上。cni0网桥会把报文发送flannel这个网络设备上,flannel其实是node上的一个后台进程&…...
System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】
前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支…...
别再乱用普通二极管了!手把手教你用BAT54S搭建20kHz小信号检波电路(附Python测试代码)
别再乱用普通二极管了!手把手教你用BAT54S搭建20kHz小信号检波电路(附Python测试代码) 在微弱信号处理领域,一个常见的误区是工程师们习惯性使用普通硅二极管进行检波。我曾在一个光电传感器项目中,发现信号经过普通二…...
WorkshopDL终极指南:如何免费下载Steam创意工坊的1000+游戏模组
WorkshopDL终极指南:如何免费下载Steam创意工坊的1000游戏模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic平台购买了游戏,却无法…...
晨芯阳HC9616带防止逆流功能,500mA高速LDO
HC9616是一系列高精度,低功耗LDO线性稳压器,内部集成防止逆流保护功能、短路保护,过流保护等功能。输出具有高精度、低噪声、高纹波抑制比、低压差等特点,输出可使用小型陶瓷电容,良好的线性和负载调整特性。且具有使能…...
学习复盘:SQL 注入原理、类型、手工注入及绕过防御
一、前言今天系统继续学习了 Web 安全核心漏洞 SQL 注入,主要的内容就是手动注入SQL 注入是Web 渗透最基础也最重要的漏洞,几乎所有动态网站都曾出现过,是学习网安很重要的一部分二、理解SQL注入1. 简单理解 SQLSQL 是操作关系型数据库的语言…...
Cadence 17.4 实战指南:从零到一构建高速PCB设计流程
1. 初识Cadence 17.4:高速PCB设计的起点 第一次打开Cadence 17.4时,那个蓝底白字的启动界面让我想起了刚入行时的场景。作为电子设计自动化(EDA)领域的标杆工具,Cadence Allegro系列一直是高速PCB设计的首选。不同于其…...
玩转CANoe CAN IG:除了手动发送,这些高级信号发生器功能你用过吗?
玩转CANoe CAN IG:解锁信号发生器的隐藏潜力 在汽车电子测试领域,CANoe的CAN IG模块早已成为工程师们的标准工具。但大多数用户仅仅停留在手动发送固定信号的层面,却忽略了内置信号发生器这一强大功能。想象一下,当我们需要模拟真…...
从模板到配方:打造可定制化现代Web项目脚手架Forge
1. 项目概述:一个为现代Web应用量身定制的脚手架如果你和我一样,在过去几年里频繁地启动新的前端或全栈项目,那你一定对“脚手架”这个词又爱又恨。爱的是,它能帮你跳过那些重复、繁琐的初始化配置,让你直接进入核心业…...
Timepix4混合像素探测器系统与DataPix4框架解析
1. Timepix4混合像素探测器系统概述Timepix4作为CERN Medipix合作组研发的第四代混合像素探测器ASIC,代表了当前粒子探测领域的最前沿技术。这款芯片采用65nm CMOS工艺制造,核心是一个由448512个像素组成的矩阵,每个像素尺寸为5555μm&#x…...
终极指南:如何用Sunshine打造家庭游戏串流服务器,实现跨设备自由游戏体验
终极指南:如何用Sunshine打造家庭游戏串流服务器,实现跨设备自由游戏体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源的自托管游戏串…...
上传论文给降AI工具会被拿去训练吗?嘎嘎降AI自研引擎不用你数据!
上传论文给降AI工具会被拿去训练吗?嘎嘎降AI自研引擎不用你数据! 把毕业论文上传给陌生工具时你心里在想什么 写论文的同学决定买降 AI 工具时,几乎都会犹豫一件事——把整篇毕业论文上传给一个陌生工具,安全吗? 具体担…...
