如何计算结构体的大小?结构体内存对齐【C语言】

news2024/11/18 18:51:10

今天我们来讲讲结构体的大小如何来计算

其中涉及到一个结构体中的热门考点:结构体内存对齐

话不多说,开始学习!

要想计算结构体的大小,首先要了解结构体的对齐规则。

目录

结构体内存对齐规则

举例

为什么存在内存对齐?

如何修改默认对齐数?


结构体内存对齐规则

1、第一个成员在与结构体变量偏移量为0的地址处。

2、其他成员变量要对齐到对齐数的整数倍地址处。

        对齐数=编译器默认对齐数与该成员大小的较小值。

        VS中默认的值为8,Linux gcc无默认对齐数,其对齐数就是成员变量自身大小。

3、结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的成员中最大对齐数的整数倍处,结构            体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

举例

struct s1
{
    char c1;
    int i;
    char c2;
};

 22e22b4ccafd48248f853d5abc701b05.png

如图,内存中有一块空间放的是结构体s1,

        (1)对于第一个成员变量c1,它在与结构体变量偏移量为0的地址处(也就是图中的0),因为c1的类型是char(占一个字节),所以图中灰色的格子放的就是c1

        (2)接着,对于第二个成员变量 i 它的类型是int,为四个字节,又因为在VS中默认对齐数是8字节,4<8,所以,变量 i 的对齐数为4。因为要放到对齐数整数倍位置,所以 i 应该放在偏移量为4的位置,图中黄色格子放的就是 i 。

        (3)再然后,对于第三个成员变量c2,它的类型是char,大小为1字节,1<8, 所以c2的对齐数是1。因为要放到对齐数整数倍位置,所以c2可以放在偏移量为8的位置,图中红色格子放的是c2.

        (4)最后,因为结构体总大小为最大对齐数的整数倍。前面我们已知c1对齐数=1,i 对齐数=4,c2对齐数=1,所以,结构体的最大对齐数为4,所以结构体的最终大小应该对齐4的整数倍位置,即图中12的位置,所以,整个结构体大小为12.

结构体嵌套问题

struct s2
{
    char c1;
    struct s1 s1;
    double d;
}

若出现结构体嵌套问题,如上图

需先计算struct s1的最大对齐数,由第一个案例可知,结构体s1的最大对齐数是4,所以struct s1对齐到4的整数倍位置即可.

为什么存在内存对齐?

大部分参考资料是这么说的:

1、平台原因(移植原因)

        不是所有平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址取某些特定类型的数据,否则抛出硬件异常。

2、性能原因:

        数据结构(尤其是栈)应该尽可能地在自然对齐边界上对齐。

原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;而对齐的内存仅需要访问一次。

总体来说:结构体内存对齐是拿空间换时间的做法。

在设计结构体的时候,让占用空间小的成员尽量集中在一起,可以既满足对集,又节省空间。

如何修改默认对齐数?

结构体在对齐方式不合适的时候,我们可以修改默认对齐数。

如:

#pragma pack(4)//更改默认对齐数为4
struct s1
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//还原为默认

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试用例该怎么设计?—— 日常加更篇(上)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;并进入官方交流群 在企业竞争加剧的今天&#xff0c;精益开发和敏捷迭代已成为产品重要的竞争力。如何保障每一次 Feature 高效迭代与安全&#xff0c;如何快速实现面对不同用户的精细化运营…

Java设计模式——单例模式

目录 一、设计模式介绍 二、设计模式类型 三、单例设计模式介绍 单例设计模式八种方式 &#xff08;一&#xff09;饿汉式&#xff08;静态常量&#xff09; &#xff08;二&#xff09;饿汉式&#xff08;静态代码块&#xff09; &#xff08;三&#xff09; 懒汉式(线程…

【Flink系列】部署篇(二):独立部署高可用Flink集群实战

服务器操作系统&#xff1a;centos7本机操作系统&#xff1a;MacFlink version: 1.15JDK version: java11HA service: ZookeeperFile System: NFS 资源分配&#xff1a; iphostnamerole10.250.0.1main0JM10.250.0.2main1JM10.250.0.3main2JM10.250.0.4worker1TM10.250.0.5wor…

Spring Cloud Eureka的使用

Spring Cloud Eureka &#x1f43b; 一个服务注册与发现的组件 &#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;ZT&#x1f604;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;&#x1f43b;…

SAP S/4HANA 采购订单处理操作详解

SAP S 4HANA Cloud 被 IDC 评为全球 SaaS 和云 ERP 系统领导者。SAP S4HANA Cloud是一套接近于零配置的系统&#xff0c;基于最佳业务实践的配置已经内嵌在标准版本中&#xff0c;可以让购买企业在第一时间内获得最全面的解决方案。本文就以其中最为常见的采购订单创建及处理流…

一页PPT自动生成短视频的研究

希望通过一些技术&#xff0c;将以前自己讲过的PPT转换成有解说的短视频&#xff0c;从而进行一些分发 旁白到语音 从文字转换成语音我们首先想到的就是TTS&#xff0c;这其中我也是用了各式各样的TTS&#xff0c;发现发音电子音非常强&#xff0c;听听起来很不舒服。后来发现…

Spring 事务和事务的传播机制

1.Spring 中事务的实现方式Spring 中的操作主要分为两类: 编程式事务 (了解)声明式事务编程式事务就是手写代码操作事务, 而声明式事务是利用注解来自动开启和提交事务. 并且编程式事务用几乎不怎么用. 这就好比汽车的手动挡和自动挡, 如果有足够的的钱, 大部分人应该都会选择自…

NPDP认证|如何实现产品的组合管理?

随着企业中研发项目类型和数量的增多,涉及的范围越来越宽广,内容越来越复杂,时效性也越来越强,传统的分散式的项目管理思想已经很难满足企业的需求。 为了使技术和资源能够得到有限的配置和利用,企业就需要把各种类型的研发项日进行有机的结合。 组合管理很重要吗? 答案是勿庸…

Vue知识点

Vue基础语法 插值操作 Mustache语法 可以直接写变量&#xff0c;也可以写简单的表达式 {{firstName lastName}}’ {{firstName lastName}} {{firstName}} {{lastName}} 其他指令使用 v-noce&#xff1a; <h2 v-once>{{message}}</h2> 某些情况下&#xff…

shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份

shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份需求说明功能实现shell 脚本实现shell 使用方式前置工具环境安装dump-k8s-yaml.sh 使用方式输入命令 bash ./dump-k8s-yaml.shdump-k8s-yaml.sh 应用举例dump-k8s-yaml.sh 输出日志信息参考文档需求说明 在基于 k8s…

【Java寒假打卡】Java基础-字符流

【Java寒假打卡】Java基础-字符流编码表字符串中的编码和解码问题字节流读取文本文件出现乱码的原因字符流读取中文的过程字符流写出数据字符流输出数据注意事项flush和close方法字符流读取数据案例-保存键盘录入的数据字符缓冲输入流字符缓冲输出流缓冲流的特有方法案例-读取文…

【算法】广度优先遍历 (BFS)

目录1.概述2.代码实现3.应用1.概述 &#xff08;1&#xff09;广度优先遍历 (Breadth First Search)&#xff0c;又称宽度优先遍历&#xff0c;是最简便的图的搜索算法之一。 &#xff08;2&#xff09;已知图 G (V, E) 和一个源顶点 start&#xff0c;宽度优先搜索以一种系…

让我用Python自制软件,看视频畅通无阻

前言 一个账号只能登录一台设备&#xff1f;涨价就涨价&#xff0c;至少还能借借朋友的&#xff0c;谁还没几个朋友&#xff0c;搞限制登录这一出&#xff0c;瞬间不稀罕了 这个年头谁还不会点技术了&#xff0c;直接拿python自制一个可以看视频的软件… 话不多说&#xff0…

终于弄懂了 非极大抑制 NMS

NMS的作用就是有效地剔除目标检测结果中多余的检测框&#xff0c;保留最合适的检测框。 以YOLOv5为例&#xff0c;yolov5模型的输入三个feature map的集合&#xff0c;加上batch的维度&#xff0c;也就是三维张量&#xff0c;即[batch&#xff0c;(p0∗p0p1∗p1p2∗p2)∗3&…

SWC步骤

纲要&#xff1a; SWC属于AUTOSAR的Component文件夹下&#xff0c;而Composition属于Composition文件夹下。 目录 1. Import "Data Type" and "Interface" information 2. Creat Software Component(SWC) 3. Create "Port" for this SWC 4.…

nexus raw 仓库代理(node-sass离线安装node-sass: Command failed)

问题背景 内网环境中使用 node 构建项目&#xff0c;项目中依赖了 node-sass&#xff0c;环境自动下载 node-saas 失败&#xff08;内网&#xff09;。 下面是构建 node-sass 的错误代码&#xff1a; [5/5] Building fresh packages... error /workspace/node_modules/node-…

nuxt概念

文章目录前言nuxt项目结构介绍网页导航文字显示&#xff08;商标&#xff09;package.jsonnuxt.config.js路由固定路由动态路由总结前言 首先了解下B2C模式&#xff0c;分前后台&#xff0c;后台一般为管理系统&#xff0c;不需要展示给过多的用户&#xff0c;而前台需要展示给…

2023年有哪些具备潜力的加密投资标的?

随着2022年一系列的黑天鹅事件&#xff08;Terra、Luna的暴雷、FTX、Three Arrows Capital等知名加密机构的破产&#xff09;&#xff0c;加密货币总市值已经从最高点的2.9万亿美元&#xff08;2021年的11月&#xff09;&#xff0c;下降到8500亿美元&#xff08;与2021年1月的…

NKOJ P7842 疫情防控

分析 这道题的本质就是找可以使得每座城市有且仅有一条道单行路进入该市的图有什么特点; 首先,我们假设图联通,则由于每个城市只有一条单行道可以进入,即一个城市必须有且仅有一条单行道与之配对,所以这个图至少要有nnn条边,即图中必须要有环才可以满足要求! 那如果图不连通…