结构体对齐规则及为什么会有结构体对齐

前言:

  大家在学习结构体中,在计算结构体大小时想必会很疑惑,为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放?今天带大家一起深入探讨一下背后的规则和原因。

结构体对齐规则:

   结构体对齐其实就是所有成员变量都要对齐到对齐数整数倍的地址处

  首先认识一下默认对齐数的概念,每个编译器都有默认对齐数,我这里使用的是vs2022,它的默认对齐数是8。

  对齐数的计算规则是:

对齐数=编译器默认对齐数与改成员变量大小(字节)的较小值

  还有一个重要特征:

结构体总大小为最大对齐数的整数倍。

接下来我举两个实例:

我定义一个如下结构体:

接下来开始计算每个成员变量的对齐数。

第一个int a,自身大小为4,根据上面的对齐数计算公式,所以它的对齐数就是4

第二个char b,自身大小为1,同理,对齐数是1

因为第一个变量对齐数是4,所以它要对齐到4的整数倍,刚好0-3地址可以存放它

第二个对齐数是1,任何位置都是1的整数倍,所以直接接在a的后面1个字节,但最后结构体的大小可不是5

因为要满足结构体总大小是最大对齐数的整数倍,此时最大对齐数是4,5不是4的整数倍,8才是4的整数倍,所以结构体总大小应该为8,这里浪费了3个字节的空间,此时在内存中的安排应该如下图:

再来一个例子把a,和b的顺序调换一下:

对齐数跟刚才上面一样,我不再计算注释在图中了。

第一个变量跟刚才一样,任何位置都是1的整数倍,所以直接放在0号位

第二个变量对齐数为4,不能直接接在第一个变量后面,因为要对齐到对齐数整数倍位置,所以要从第四个字节开始放,如下图:

所以这个结构体的大小也是8,从上面两个例子不难看出,虽然结构体大小一样但它们的内存安排是可以不一样的。

注意如果结构体里面嵌套了结构体,那么嵌套在里面的结构体对齐数是:

该结构体的最大对齐数。

如下图所示:

为什么要结构体对齐?

  从上面的例子不难看出,结构体对齐是会浪费空间的,可是为什么要这样做呢?其实就是以空间换时间,那它是怎么来换时间的呢?

  首先需要明白一点,我们的cpu读取数据不是一个字节一个字节的读,假设我们是32位的机器(64位的同理),cpu上就会有32根总线,每根总线读取一个比特位,一个字节8个比特位,换算过来就是一次可以读取4个字节,所以这就导致了cpu一只只能固定读取4个字节,而且必须从4的整数倍处开始读取。

 接下来给大家举个例子:

对比一下对齐和不对齐的内存安排,它们在内存里就是这样的:

刚才解释了我们的32位的cpu只能从4的整数倍开始读,假设我们要读a这个数据。

我们先来看看不对齐的时候该怎么读a:

首先它不能从1号位地址开始读,因为这里不是4的整数倍,cpu只能从0读到3或者从4读7,这就导致了不对齐的情况想读a的话,需要先读0-3,读取a的上面一部分,再读4-7读取a的下面一部分把这两部分组合起来,所以读了两次才能读到a

再来看看对齐的情况:

对齐的话,我们就可以直接读4-7,一次即可把a读完。

总结:

  所以,不难看出对齐可以大大减少我们cpu的压力,提高效率,以空间换时间。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【防网盘在线解压】Peazip 豌豆压缩 v9.7.0

软件介绍 Peazip 是一个免费的文件归档应用程序, 支持跨平台,是和WinRar、WinZip类似软件的开源免费替代品;支持压缩/ 存档到 7Z, ARC、Brotli BR、BZip2、GZip、 PAQ、PEA、RAR、自解压档案、TAR、WIM、XZ、Zstandard ZST、打开…

最短路径(dijstra算法,链式前向星,堆优化)

【模板】单源最短路径(弱化版) 对于这题我们使用邻接矩阵的话会导致弓箭复杂度会大大提升,所以我们就需要学习一种新的数据结构,名叫链式前向星,在链式前向星中,我们需要定义一个结构体数组,其中…

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本: 项版本babe…

SVD奇异值分解

一、奇异值 奇异值(Singular Values)是线性代数中矩阵的重要性质之一,与奇异值分解(SVD)密切相关。让我们来更详细地了解一下奇异值的概念: 定义: 对于一个矩阵 ( A ),它的奇异值是…

C++ “雪花算法“原理

C雪花算法并不是传统的数据结构与算法而是一种崭新的分布式算法 属于深层次C 本篇文章就来描述一下雪花算法 什么是雪花算法: 雪花算法(Snowflake)是Twitter开源的一种分布式唯一ID生成算法。它可以在不依赖于数据库等其他存储设施的情况下&#xff0c…

算法刷题:有效三角形个数

有效三角形个数 .题目链接题目详情算法原理补充知识点双指针:对撞指针 我的答案 . 题目链接 有效三角形个数 题目详情 算法原理 补充知识点 有效三角形需要满足的条件: ab>cac>bbc>a 其实在满足1的时候,c是最大的,那么2和3是显然成立的,因此我们可以这样解题: 对…

platformio 提示 fatal error: TimeLib.h: No such file or directory 的解决方案

在platformio编译arduino项目的时候,如果提示fatal error: TimeLib.h: No such file or directory,解决方法有2: 方法1: 在项目的platformio.ini文件中,添加 lib_deps # Using library Id44方法2: 通过…

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容,本章回中将介绍characters包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

阿里云“BGP(多线)”和“BGP(多线)_精品”区别价格对比

阿里云香港等地域服务器的网络线路类型可以选择BGP(多线)和 BGP(多线)精品,普通的BGP多线和精品有什么区别?BGP(多线)适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布,开启一个新时代 1月18日下午,在“鸿蒙千帆起”发布会上,华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来,在众多伙伴和开发者的共同努力下,鸿蒙生态设备数已达8亿,…

论文阅读:四足机器人对抗运动先验学习稳健和敏捷的行走

论文:Learning Robust and Agile Legged Locomotion Using Adversarial Motion Priors 进一步学习:AMP,baseline方法,TO 摘要: 介绍了一种新颖的系统,通过使用对抗性运动先验 (AMP) 使四足机器人在复杂地…