[c/c++] 结构体对齐

在 c 语言中,结构体的大小并不是结构体每个成员的大小之和,结构体的大小往往比结构体的成员大小之和要大。如下结构体,每个成员的大小分别是 1、4、1,但是结构体的大小却不是 6,而是 8。

struct Test {

  char a;

  int b;

  char c;

};

自然对齐:

如果一个数据的内存地址正好是这个数据大小的整数倍,那么说这个数据是自然对齐的。比在 64 位机器上,一个 int 类型的数据地址是 4 的整数倍,一个 long 类型的数据地址是 8 的整数倍,那么说这两个数据是自然对齐的。

有些处理器要求访问的数据是自然对齐的。gcc 编译器编译之后,默认情况下数据也是对齐的。

(1)数组

按照数组元素自然对齐,而不是按照数组整体的大小进行对齐

(2)union

长度最大的元素对齐

(3)结构体

结构体中每个元素对齐即可,结构体有填补机制。

本文主要讨论结构体中的对齐。

1 结构体对齐

(1)结构体中每个成员都是自然对齐的

(2)结构体最后存在补偿,以结构体对齐的长度进行补偿

(3)结构体中如果有结构体成员,那么并不是以结构体成员的长度进行对齐的,而是结构体成员里边的最大的成员进行对齐的,最终还是以最长的基本数据类型对齐的

(4)结构体中包含数组,并不是以数组的整体大小进行对齐的,而是以数组的元素进行对齐的

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct A {
  char a; // 1 --> 8, 后边的 b 是 long 类型,8 个字节,所以 a 后边空出了 7 个字节没用
  long b; // 8
  int  c; // 4
  char d; // 1 --> 4,结构体是 8 字节对齐的,后边要补偿 3 字节
}; // 24

struct B {
  char a; // 1 --> 4 // 后边 b 是 int 类型的,b 要求其,a 后边空出 3 个字节
  int b; // 4
  char c; // 1 --> 4 // 结构体是 4 字节对其的,所以 c 后边补偿 3 个字节
}; // 12

struct C {
  char a; // 1 --> 8
  struct A b; // 24
  char c; // 8
}; // 40

struct D {
  char a; // 1 --> 4
  struct B b; // 12
  char c; // 1 --> 4, 结构体里边包括另一个结构体,大小为 12,但是 struct D 并不是按照 12 对齐的,仍然是按照基本数据类型的最大值进行对齐的
}; // 20

struct E {
  char a; // 1
  char b[13]; // 13,数组不是以数组整体的大小对齐的,而是以数据的元素进行对齐的
  char c; // 1
}; // 15

union F { // union 不同的成员共享一块内存地址,以最长的成员进行对齐
  char a; // 1
  long b; // 8
  int c; // 4
}; // 8

union G {
  char a; // 1
  struct A b; // 24
}; // 24

struct H {
  long a; // 8
  char b; // 1 --> 8
  union F c; // 8
}; // 24

int main() {
  printf("sizeof(struct A) = %lu\n", sizeof(struct A));
  printf("sizeof(struct B) = %lu\n", sizeof(struct B));
  printf("sizeof(struct C) = %lu\n", sizeof(struct C));
  printf("sizeof(struct D) = %lu\n", sizeof(struct D));
  printf("sizeof(struct E) = %lu\n", sizeof(struct E));
  printf("sizeof(union F) = %lu\n", sizeof(union F));
  printf("sizeof(union G) = %lu\n", sizeof(union G));
  printf("sizeof(struct H) = %lu\n", sizeof(struct H));
  return 0;
}

运行结果如下:

2 函数中的形参和局部变量

如下代码中,test 函数中的入参和局部变量,也是自然对齐的。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


void test(char a, long b, int c) {
  long la = 100;
  char lb = 'a';
  int lc = 200;
  printf("&a = %p, &b = %p, &c = %p\n", &a, &b, &c);
  printf("&la = %p, &lb = %p, &lc = %p\n", &la, &lb, &lc);
}

int main() {
  test(10, 20, 30);
  return 0;
}

运行结果如下,从地址来看,为了节省空间,编译器还对入参和局部变量进行了重新排序。入参在内存中的地址并不是完全按照 a、b、c 的正序或者反序进行排列的,而是按照 b、c、a 的顺序进行排列的;局部变量也存在这样的规律。

结构体中的变量,编译器并不会进行重新排序,这是 ANSI C 中明确规定的,不允许编译器改变结构体成员的次序。

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/429797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么将pom在文件放到src下方

今天在IDEA从git拉取项目的时候&#xff0c;发现pom.xml文件在文件夹src的上方&#xff0c;平时看惯了项目的pom.xml文件在文件夹src的下方&#xff0c;应该怎么去设置呢&#xff1f; 点击设置——>点击Folder Always on Top 即可 参考&#xff1a;http://t.csdnimg.cn/s34…

淘宝买家卖家ERP API(添加购物车、上下架商品、订单)

custom-自定义API操作 taobao.custom 调用地址 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_se…

【JavaEE进阶】部署Web项目到Linux服务器

文章目录 &#x1f343;前言&#x1f340;什么是部署&#x1f332;环境配置&#x1f6a9;数据准备&#x1f6a9;程序配置⽂件修改 &#x1f384;构建项目并打包&#x1f38b;上传Jar包到服务器,并运行&#x1f6a9;上传Jar包&#x1f6a9;运行程序&#x1f6a9;开放端口号 &…

HotFix原理学习 IL2CPP 学习

原文链接&#xff1a;Unity 游戏用XLua的HotFix实现热更原理揭秘-CSDN博客 本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法。这个方法的 第一步&#xff1a;通过对C#的类与函数设置Hotfix标签。来标识需要支持热更的类和函数。第二步&#xff1a;生成函数连接器…

2024年【焊工(初级)】考试题及焊工(初级)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试题是安全生产模拟考试一点通生成的&#xff0c;焊工&#xff08;初级&#xff09;证模拟考试题库是根据焊工&#xff08;初级&#xff09;最新版教材汇编出焊工&#xff08;初级…

XM外汇平台自行扣除客户账户资金,理由荒谬且无据!

小编在FX110网多年&#xff0c;也算是“见多识广”了&#xff0c;可虽说是见惯了平台的“骚操作”&#xff0c;但对于XM平台这一次的行径&#xff0c;还是挺震惊的&#xff0c;只能说平台方多少有点无赖了&#xff01; 事故源于一位XM用户的一次出金&#xff0c;发现莫名其妙被…

LeetCode每日一题之 复写0

目录 题目介绍&#xff1a; 算法原理&#xff1a; 特殊位置处理&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 这种对数组元素进行修改&#xff0c;移动的题目我们仍然可以…

LeetCode-02

225. 用队列实现栈 用两个队列实现栈的功能&#xff0c;思路如下&#xff1a; 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列&#xff0c;直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它们的输出电流和用途。 3.3V&#…

命名实体识别NER(综合代码示例)

一、命名实体识别发展方向 二、中文数据集 CCKS2017开放的中文的电子病例测评相关的数据。 评测任务一&#xff1a;https://biendata.com/competition/CCKS2017_1/ 评测任务二&#xff1a;https://biendata.com/competition/CCKS2017_2/ CCKS2018开放的音乐领域的实体识别任务…

大唐杯学习笔记:Day4

1.1NR帧结构 5G NR中,依然采用一帧10ms,并将一帧分为10子帧,每个子帧为1ms。每个子帧包含几个时隙(slot),每个时隙由14个OFDM符号构成(在常规CP下)。 μ \mu μ Δ f 2 μ ∗ 15 [ K H Z ] \Delta f2^{\mu}*15[KHZ] Δf2μ∗15[KHZ]Cyclic prefix015Normal130Normal260Normal…

【鸿蒙 HarmonyOS 4.0】应用状态:LocalStorage/AppStorage/PersistentStorage

一、介绍 如果要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。 LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的状态共享。AppStorage&#xff1a;特殊的单例LocalStorage对象&…

jxls——自定义命令设置动态行高

文章目录 前言依赖引入绘制 jxls 批注的 excel 模板测试类编写自定义命令关于自动换行 前言 之前的博客中都简单说了数据的渲染和导出excel文件。包括固定的 表头结构&#xff0c;以及动态 表头和表数据等方式。 本篇博客主要说明自定义命令的方式&#xff0c;控制输出excel文…

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;Bert…

固定资产管理系统包括哪些

固定资产管理是企业经营过程中一项非常重要的任务。它涉及到公司的核心资产&#xff0c;包括土地、建筑物、设备、车辆等。为了有效地管理这些资产&#xff0c;许多企业选择使用固定资产管理系统。那么&#xff0c;固定资产管理系统的内容是什么呢&#xff1f;本文将为您进行全…

O2OA(翱途)通过服务来调用接口实现单点登录案例

本文介绍O2OA服务管理中&#xff0c;接口的权限设定和调用方式。 创建接口 具有服务管理设计权限的用户&#xff08;具有ServiceManager角色或Manager角色&#xff09;打开“服务管理平台”&#xff0c;进入接口配置视图&#xff0c;点击左上角的新建按钮&#xff0c;可创建一…

webpack基础配置及使用

webpack是什么 是一个现代 JavaScript 应用程序的静态模块打包器。当webpack 处理应用程序时&#xff0c;它会递归地构建一个依赖关系图 &#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个 bundle 。主要有 五个核心概念&#xff1a…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器&#xff0c;确保数据发送到正确的客户机和服务器上。 SSL可以加密数据&#xff0c;防止数据中途被窃取。 SSL也可以维护数据的完整性&#xff0c;确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目&#xff0c;在开发中遇到了一个小知识点&#xff0c;在大屏中如何实现人体动态图。然后看了下echarts官方文档&#xff0c;根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图&#xff0c;象形柱图是…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…
最新文章