【关于结构体内存对齐问题】(上)

简介: 【关于结构体内存对齐问题】

一 .计算结构体的大小


首先我们来看一道例题:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>structS1{
charc1;
inti;
charc2;
};
structS2{
charc1;
charc2;
inti;
};
intmain() {
printf("%d\n", sizeof(structS1));
printf("%d\n", sizeof(structS2));
return0;
}

如果没有了解过结构体内存对齐,我们很容易想到,char占1个字节,int占4个字节,S1总共占6个字节,S2占6个字节,打印的结果就是6和6,可当我们运行起来发现并不是,答案是12和8;

4c5f6fd8325f430f9fab23032e66b0db.png

51c8092d16b8465d9c64d31f60071c03.png

接下来我们就来讨论关于结构体在内存中是如何对齐的



二,关于结构体内存对齐规则


首先得掌握结构体的对齐规则:

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

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

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

VS 中默认的值为 8

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

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


1)这里介绍一下偏移量和对齐数


偏移量:

我们把一个格子当做一个字节,最顶上那个位置我们叫做其实位置,相对偏移量为0的地方就是第一个格子,偏移量为1的地方就是第二个格子,以此类推,如图所示:

e61a9a5432434b1c8821cc405d982d23.png

对齐数:

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,举个例子,vs中的默认对齐数是8,char是一个字节,char类型的最大对齐数就是1,int是4个字节,int类型的最大对齐数就是4,double是8个字节,double类型的最大对齐数就是8.

目录
相关文章
|
SQL 消息中间件 关系型数据库
实时计算 Flink版产品使用合集之 sql采集mysql能拿到before的数据吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
存储 人工智能 API
阿里 Qoder 新升级,Repo Wiki 支持共享、编辑和导出
Qoder 是阿里巴巴推出的 Agentic 编程平台,集成顶尖编程模型,具备强大上下文工程能力,可一次检索10万代码文件,大幅提升软件开发效率。其 Repo Wiki 功能自动生成结构化文档,支持共享、编辑与导出,助力知识沉淀与团队协作。
|
9月前
|
Linux 虚拟化 数据安全/隐私保护
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
备份的重要性在于它能在系统出现异常或错误时,帮助我们快速恢复到正常状态,避免重新安装系统和配置环境。VMware 提供了两种备份方式:快照和克隆。 **快照**是保存虚拟机某一时刻的完整状态(包括内存、CPU、磁盘数据),便于快速回滚,适合临时保存状态。操作简单,可在系统运行时创建。 **克隆**则是复制整个虚拟机系统,侧重长期备份,需在系统关闭时进行。分为完整克隆和链接克隆,前者独立于源系统,占用更多空间,但更安全可靠。
404 17
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
|
IDE 开发工具
IDEA如何快速定位到当前打开文件所在的目录
【10月更文挑战第7天】在 IntelliJ IDEA 中,要快速定位当前文件的目录,可通过侧边栏或快捷键实现。在侧边栏的项目结构中,文件以层级结构显示,便于浏览;使用 `Alt + F1` 快捷键,选择 “Select in”-&gt; “Project View”,即可迅速定位文件所在目录,方便管理和导航。
5340 3
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的智能草莓病害检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割(2)
基于YOLOv8深度学习的智能草莓病害检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割
|
前端开发 小程序
微信小程序前端(纯前端)如何解密手机号?
微信小程序前端(纯前端)如何解密手机号?
微信小程序前端(纯前端)如何解密手机号?
|
网络协议 安全 网络安全
网络基础知识
网络基础知识
198 0
|
人工智能 API 算法框架/工具
课时1:ModelScope社区Library技术架构介绍
课时1:ModelScope社区Library技术架构介绍
|
数据采集 编解码 监控
清华大学《信号与系统》电力系统同步相量计算【FFT/谐波/小波变换】
清华大学《信号与系统》电力系统同步相量计算【FFT/谐波/小波变换】
|
存储 NoSQL 自动驾驶
MongoDB在自动驾驶场景方案及最佳实践
MongoDB在自动驾驶场景方案及最佳实践