结构体内存对齐规则

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

偏移量

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

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中的一个字节进行判断即可!

目录
相关文章
|
12月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5361 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提供多种数组操作函数,方便添加、合并元素。
|
2天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
4天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
4天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
536 2
kde
|
4天前
|
人工智能 关系型数据库 PostgreSQL
n8n Docker 部署手册
n8n是一款开源工作流自动化平台,支持低代码与可编程模式,集成400+服务节点,原生支持AI与API连接,可自托管部署,助力团队构建安全高效的自动化流程。
kde
362 3