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

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

一 .计算结构体的大小


首先我们来看一道例题:

#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版的一些典型使用合集。
|
8月前
|
Linux 虚拟化 数据安全/隐私保护
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
备份的重要性在于它能在系统出现异常或错误时,帮助我们快速恢复到正常状态,避免重新安装系统和配置环境。VMware 提供了两种备份方式:快照和克隆。 **快照**是保存虚拟机某一时刻的完整状态(包括内存、CPU、磁盘数据),便于快速回滚,适合临时保存状态。操作简单,可在系统运行时创建。 **克隆**则是复制整个虚拟机系统,侧重长期备份,需在系统关闭时进行。分为完整克隆和链接克隆,前者独立于源系统,占用更多空间,但更安全可靠。
309 17
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
|
前端开发 小程序
微信小程序前端(纯前端)如何解密手机号?
微信小程序前端(纯前端)如何解密手机号?
微信小程序前端(纯前端)如何解密手机号?
|
网络协议 安全 网络安全
网络基础知识
网络基础知识
174 0
|
存储 NoSQL 自动驾驶
MongoDB在自动驾驶场景方案及最佳实践
MongoDB在自动驾驶场景方案及最佳实践
|
数据采集 编解码 监控
清华大学《信号与系统》电力系统同步相量计算【FFT/谐波/小波变换】
清华大学《信号与系统》电力系统同步相量计算【FFT/谐波/小波变换】
【UCIe】FDI & RDI 接口信号释义
【UCIe】FDI & RDI 接口信号释义
1936 0
【UCIe】FDI & RDI 接口信号释义
|
弹性计算 运维 Kubernetes
《2023云原生实战案例集》——05 金融服务——视野数科 运维提效60%,SAE+Jenkins打造云原生DevOps
《2023云原生实战案例集》——05 金融服务——视野数科 运维提效60%,SAE+Jenkins打造云原生DevOps
|
缓存 前端开发 JavaScript
nginx的location与rewrite
需要注意的是在location的 / 这个是重点,一定要清楚的知道root表示指明路径为对应的location “/” URL。以右侧/而言;而alias相对于左侧/而言。而且还要明白匹配时的有限顺序,当location匹配到之后就不会看下面的location的。而在 rewrite规则当中,需要明白的时只有规则完成,跳出循环,而其它三种时不可以的,其他三种还是会网下去匹配的。
490 0
nginx的location与rewrite
|
数据可视化 JavaScript 前端开发
数据可视化工具|学习笔记
快速学习数据可视化工具
数据可视化工具|学习笔记