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

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

一 .计算结构体的大小


首先我们来看一道例题:

#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.

目录
打赏
0
0
0
0
1
分享
相关文章
DHorse(K8S的CICD平台)的实现原理
首先,本篇文章所介绍的内容,已经有完整的实现,[可以参考这里](https://gitee.com/i512team/dhorse)。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如jekines,还有一些商业公司推出的自动化构建工具,但他们都不能够很好的和云环境相结合。那么[究竟该如何实现一个简单、快速的基于云环境的自动化构建系统呢](https://gitee.com/i512team/dhorse)?我们首先以一个Springboot应用为例来介绍一下整体的发布流程,然后再来看看具体如何实
libusb简介及在Linux中安装libusb
最近做了关于在X86环境下通过FT232H芯片实现的USB转SPI的相关驱动,接触到了libusb。libusb是一个开源的用C实现的,应用程序与用户的USB设备进行通信的库。它是可移植的,对外使用统一的API,支持Windows、macOS、Linux、Android。它是用户模式(user-mode),应用程序与USB设备通信不需要高权限,但是在Android下好像有些接口需要root权限才能调用成功。它支持所有版本的USB协议。它的License是LGPL,源码地址在https://github.com/libusb/libusb,最新发布版本为1.0.23。
libusb简介及在Linux中安装libusb
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
备份的重要性在于它能在系统出现异常或错误时,帮助我们快速恢复到正常状态,避免重新安装系统和配置环境。VMware 提供了两种备份方式:快照和克隆。 **快照**是保存虚拟机某一时刻的完整状态(包括内存、CPU、磁盘数据),便于快速回滚,适合临时保存状态。操作简单,可在系统运行时创建。 **克隆**则是复制整个虚拟机系统,侧重长期备份,需在系统关闭时进行。分为完整克隆和链接克隆,前者独立于源系统,占用更多空间,但更安全可靠。
145 17
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
433 1
ODPS SQL问题之ODPS逻辑层包含哪些角色,它们各自的功能是什么
ODPS SQL 问题之ODPS逻辑层包含哪些角色,它们各自的功能是什么
114 0
基于SpringBoot+Vue+uniapp的外卖点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的外卖点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
282 0
了解vue3的基本特性和底层原理
Vue3的底层原理涵盖了响应式系统的Proxy-based实现、组件的模板编译与渲染更新机制、组合式API带来的逻辑组织变革,以及其他关键特性的具体实现。这些原理共同构成了Vue3强大、高效、灵活的现代前端开发框架基础。
681 2
教你实现微信8.0『炸裂』的礼花表情特效
作为一个前端程序员,这就勾起了我的好奇心,虽然我从来没有实现过这样的动画,但是我还是忍不住想要去实现,最终我花了2天时间去看一些库的源码到我自己实现一个类似的效果,在这里我总结一下,并且手把手地教大家怎么学习实现。而🎉有一个自己的名字,叫做五彩纸屑,英文名字叫 confetti。
教你实现微信8.0『炸裂』的礼花表情特效
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问