当前位置: 首页 > news >正文

计算结构体大小

计算结构体大小

目录

  • 计算结构体大小
    • 一. 结构体内存对齐
      • 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的偏移字节数)。


三. 内存对齐的意义

  1. 在不同平台下,不是所有硬件平台都可以取任意地址访问数据,某些平台只能在某些地址处取特点大小的数据。
  2. 此时对于内存对齐后的数据,处理器访问会更加便捷

示例:
在这里插入图片描述

结构体内存对齐为了用空间来换取时间

但是我们可以利用结构体内存对齐规则,更合理的设计成员变量位置,如:让占用空间小的成员放在一起。

四. 修改默认对齐数

在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三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节&#xff08;bety&#xff09;为单位 1. 简介 对于结构体成员在内存里的存储&#xff0c;存在结构体的对齐规则&#…...

第二十一篇 数据增强

文章目录 摘要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&#xff0c;然后提示请求超时&#xff0c;几分钟之后恢复正常 接到报障之后&#xff0c;马上根据接口URL&#xff0c;定位到了请求链路&#xff0c;发现是es查询超时&#xff0c;这里我们的业务订单表数据是由几百万的&a…...

分布式之ZAB协议

写在前面 假定我们现在使用zk执行了如下的指令&#xff1a; [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 手动清理文章参考&#xff1a; http://www.360doc.com/content/22/0418/08/65840191_1027038859.shtml https://www.cnblogs.com/kiko2014551511/p/11532426.html…...

Windows下载安装Prometheus

目录 资料 下载 解压 点击prometheus.exe运行 资料 Prometheus是一个开源的系统监控和报警系统&#xff0c;同时也支持多种exporter采集数据&#xff0c;还支持pushgateway进行数据上报&#xff0c;Prometheus性能足够支撑上万台规模的集群。 官网&#xff1a;https://pr…...

0-1背包、完全背包及其变形【零神基础精讲】

来源0x3f&#xff1a;https://space.bilibili.com/206214 三叶姐的对背包问题的总结&#xff1a;【宫水三叶】详解完全背包一维空间优化推导&#xff08;附背包问题攻略&#xff09;https://leetcode.cn/circle/discuss/GWpXCM/ 文章目录0-1背包、完全背包及其拓展&#xff08;…...

OpenStack

OpenStack优势&#xff1a; 1、模块松耦合。 2、组件配置较为灵活。 3、二次开发容易 OpenStack共享服务组件&#xff1a; 1、数据库服务&#xff1a;MongoDB 2、消息列队&#xff1a;RabbitMQ 3、缓存&#xff1a;Redis 4、存储&#xff1a;Ceph 5、负载均衡&#xff…...

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha&#xff0c;创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口&#xff0c;在接口中使用 kaptcha 工具类来生成验证码图片&#xff08;验证码信息&#xff09;并返回3 登录时从sess…...

【2023】某python语言程序设计跟学第一周内容

本文说明&#xff1a; 案例内容为北理工python语言程序设计课程&#xff0c;如有不妥请联系&#xff01; 目录温度转换案例&#xff1a;执行结果&#xff1a;代码解析&#xff1a;白话说明&#xff1a;举一反三&#xff1a;根据输入半径求圆周长或面积执行结果&#xff1a;温度…...

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难&#xff0c;努力地进行深度钻研&#xff0c;生产内容&#xff1b;而大多数信息受众始终在享受轻度学习&#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地&#xff0c;那就应该尽早抛弃轻松学习的幻想&#xff0c;锤炼深度学习…...

“ChatGPT之父”Sam Altman:我是如何成功的?

背靠微软&#xff0c;OpenAI能拳打谷歌&#xff0c;脚踢Meta&#xff0c;它背后的男人&#xff0c;必然不简单。 让我们来看一看&#xff0c;Sam Altman是如何一步步成长为今天这个搅动全世界的男人。 山姆奥特曼&#xff08;Sam Altman&#xff09; 成长和创业经历 在YC创始…...

jQuery发送Ajax请求的几种方式

概述JQuery发送ajax请求的方法有很多&#xff0c;其中最基本的方法是$.ajax&#xff0c;在其中封装的方法有 $.get, $post等。我们分别举了不同的示例。数据格式首先&#xff0c;浏览器与服务器之间传输数据所采用的格式&#xff0c;比较常见的有json&#xff0c;jsonp&#xf…...

Android实现连线题效果

效果图全部正确&#xff1a;有对有错&#xff1a;结果展示&#xff0c;纯黑色&#xff1a;支持图片&#xff1a;实现思路仔细分析可以发现&#xff0c;连线题的布局可以分为两部分&#xff0c;一个是左右两列矩形&#xff0c;另一个是他们之间的连线。每个矩形的宽高都一样&…...

以数据 见未来!首届未来数商大会成功举办

2月25日&#xff0c;2023未来数商大会在杭州未来科技城学术交流中心举办。大会发布了数商产业趋势研究报告&#xff0c;首次提出并探讨了完整的数商产业概念&#xff0c;并成立了未来数商联盟&#xff0c;开通了浙江大数据交易服务平台余杭专区。会上&#xff0c;杭州未来科技城…...

Java数据结构与算法——手撕LRULFU算法

LRU算法 力扣146&#xff1a;https://leetcode-cn.com/problems/lru-cache/ 讲解视频&#xff1a;https://www.bilibili.com/video/BV1Hy4y1B78T?p65&vd_source6f347f8ae76e7f507cf6d661537966e8 LRU是Least Recently Used的缩写&#xff0c;是一种常用的页面置换算法&…...

20230227英语学习

Can Clay Capture Carbon Dioxide? 低碳新思路&#xff1a;粘土也能吸收二氧化碳&#xff01; 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吗&#xff1f; redux 是一个应用数据流框架&#xff0c;主要解决了组件之间状态共享问题&#xff0c;原理是集中式管理&#xff0c;主要有三个核心方法&#xff1a;action store reduce 工作流程 view 调用store的dispatch 接受action传入的store&#xff0c;reduce…...

k8s node之间是如何通信的?

承接上文同一个node中pod之间如何通信&#xff1f;单一Pod上的容器是怎么共享网络命名空间的&#xff1f;每个node上的pod ip和cni0网桥ip和flannel ip都是在同一个网段10.1.71.x上。cni0网桥会把报文发送flannel这个网络设备上&#xff0c;flannel其实是node上的一个后台进程&…...

System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇都是超级用心编写的&#xff0c;有兴趣的伙伴们都支…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...