结构体内存对齐规则

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

偏移量

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

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

目录
相关文章
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5695 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提供多种数组操作函数,方便添加、合并元素。
|
9天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
706 154