结构体内存对齐规则

简介: 结构体内存对齐规则

偏移量

首先我们先来看这样的一段代码

struct test1 {

  char i;
  char a;
  double c;

};

struct test2 {
  
  char c;
  double a;
  char b;
  
};

int main()
{
  printf("%d ",sizeof(struct test1));
  printf("%d ", sizeof(struct test2));
  return 0;
}

你认为结构体test1与test2的大小会一样吗?下面给出运行结果:

可以发现,test1与test2中的变量类型是一样的,为啥大小就不一样了呢?其实在结构体存储中是按照一定规则进行存储的,并不是连续进行存储的!它们的存储是根据偏移量以及对齐数来进行存储的!!!


偏移量:我们以结构体存储的位置作为参考点(标记作为0位置开始),之后的地址距离这个参考点的距离我们称之为偏移量!

偏移量的计算

首先我们需要包含头文件

#include <stddef.h>

代码如下:

struct test2 {
  
  char c;
  double a;
  char b;
  
};


int main()
{
  printf("%d ", offsetof(struct test2, a));
  return 0;
}

运行结果如下:

注:第一个参数是结构体,第二个参数是结构体里面的变量

存储规定

规定:
1 结构体中的第一个变量存储位置的偏移量为0,之后在进行类型存储
2 从第二个变量开始,我们取该类型的对齐数(该类型的大小和编译器中的默认对齐数中取最小
的那个),然后从偏移量是最小对齐数的倍数的位置开始存放数据!
3 所有变量存储完毕之后,所占的字节数必须是各个变量中的那个对齐数中最大的那个数的倍数!

注:在vs中给出对齐数是8,gcc环境下的对齐数就是类型的大小!我们以vs为例!

图解test1:

图解test2:


嵌套结构体

结合上文,我们再来看这样一段代码:

struct test3 {
  char a;
  struct test1;
  int x;
};

int main()
{
  printf("%d\n", sizeof(struct test3));
  return 0;
}

这段代码的运行结果又是多少呢?

运行结果如下:

图解如下:

大小端存储

我们是以字节为单位,讨论数据在内存中的存储顺序!

由计算机中数据的存储方式我们知道(以补码的形式来存储),dd是低字节的内容:

由此我们可以得出大小端村粗方式的定义:

大端存储方式:高字节的内容放到低地址处我们称为大端存储序,反之,则为小端存储序!

如何判断一个机器是大端存储还是小端村粗呢?可以参考以下代码的编写:

int main()
{
  int x = 1;
  char* p = (char*)&x;
  printf("%d", *p);
  return 0;
}

如果p打印出来是1,说明是小端否则为大端,这里主要截取了x中的一个字节进行判断即可!

目录
相关文章
|
11月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5018 2
WebAssembly:让前端性能突破极限的秘密武器
Julia 元组
Julia 中的元组是不可变的有序元素集合,与数组用法相似但用小括号表示。创建元组如 `(5, 10, 15, 20, 25, 30)`,可以使用数组函数操作,如 `tupl[3:end]` 获取子元组。尝试修改元组元素会导致错误,如 `tupl2[2]=0` 会抛出 `MethodError`。
|
存储 索引
Julia 数组
Julia支持可变大小、类型灵活的数组,包括一维和多维。数组通过方括号创建,元素间用逗号分隔,如 `[1,2,3]`。索引使用整数,且数组元素可以不同类型,如 `[1, &quot;RUNOOB&quot;, 2.5, pi]`。Julia提供多种数组操作函数,方便添加、合并元素。
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1062 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
738 23