首页 > 其他分享 >字节对齐问题

字节对齐问题

时间:2023-12-04 14:01:09浏览次数:28  
标签:字节 问题 uint 要存 大小 对齐 变量

字节对齐的作用

  1. 节约内存空间,对于一个结构体 不同的成员变量顺序会影响最终存储占用的空间

  2. 加深对不同平台字节数的理解和记忆

什么是字节对齐

  1. 一般是相对于结构体而言

  2. 说人话就是,结构体最终占用的空间,往往不是看起来占用的空间

  3. 总结起来就是按照结构体的顺序挨个存,存之前必须确保当前大小是接下来要存的变量大小整数倍,最后存完要确保是结构体最大的变量大小的整数倍

  4. 可能有点抽象,主要涉及几个概念:当前大小 接下来要存的变量大小 结构体最大的变量大小

举例讲解

struct A{
uint_8 a;
uint_16 b;
uint_32 c;
uint_64 d;
}

先明确一点,系统要求的大小,学名叫系统默认对齐字节数,我目前遇到的任务,要求是4字节,因地制宜

  1. 按照顺序存储,先存a,当前大小就是0,接下来要存的变量(a)大小就是1字节(uint_8表示跨平台8位)
  2. 存b,依次是 当前大小1字节,接下来要存的b是2字节,由于:
    确保当前大小是接下来要存的变量大小整数倍
    1不是2的整数倍,所以要补充一字节到2!
  3. 存c,当前大小2+2=4字节,接下来要存的c是4字节。所以直接存就行
  4. 存d,当前大小4+4=8字节,接下来要存的d,看似8字节,实则系统要求最多4字节,所以只能分开存!!!!
  5. 结构体最大的变量大小,也就是max(1,2,4,8)得8,16是他的整数倍,所以最后不用扩
    所以:接下来要存的字节数 = min(系统要求的字节数,该变量占用的字节数)

综上所述,结构体成员变量字面上占用1+2+4+8=15字节,实际占用1+1+2+4+4+4 = 16字节!!!

其他要注意的

  1. 数组一个一个存,实际上只要数组第一个元素对齐了后面自动对齐,因为第一个前面的是n倍了,继续加同类型变量就是n+1倍
  2. 不同的顺序会导致不同的结果,比如上面这个例子,按照uint_8 uint_32 uint_16 uint_64存,存uint_32就需要对齐3个,一共需要1+3+4+2+4+4=18字节,最后在对齐整体做到4的倍数(为什么不是8呢,因为被截断了)也就是需要20字节!!
  3. 数组比如int[5],不会改变“结构体最大的变量大小”,因为是每个元素依次存储的!
  4. 全uint_8或者char(绝大多数平台都是1字节)是最好的,因为不需要任何字节对齐!

改变系统默认字节对齐数

pragma pack()命令可以指定默认对齐字节数,可选参数有1/2/4/8/16,不带参或参数非以上值时,将恢复默认值。

#pragma pack(2)
struct xxx{

}
#pragma pack()

判别步骤

注意的点

  1. 先看系统默认对齐字节数是多少,如果很大比如16,那么“接下来要存的变量大小”就是该变量实际大小,存前考虑前面的值对齐
  2. 如果系统默认字节数是1 2 这种比较小的,那么“接下来要存的变量大小”很可能要被截断!!!

步骤

  1. 按结构体内变量的顺序找,从第一个开始存,min(名义占字节,系统默认对齐字节)得到的值就是存这个变量实际小号的内存空间
  2. 依次寻找最后相加
  3. 记录最长的内存段,这个值=最大的内存片段,如果系统默认很小会被截断,比如系统默认是1,那么就是1没得商量,每个片段都是1,,最后要补到1的倍数也就是不用补

标签:字节,问题,uint,要存,大小,对齐,变量
From: https://www.cnblogs.com/xsl-blogs/p/17874472.html

相关文章

  • AcWing 842. 排列数字 && AcWing 843. n-皇后问题
    842.排列数字(全排列)题面:给定一个整数\(n\),将数字\(1∼n\)排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。#include<iostream>usingnamespacestd;constintN=10;intpath[N];//保存序列boolst[N];//数字是否被用过,bool类型的全局变......
  • 【FAQ】运动健康服务端侧数据常见问题及解答
    目录Q1:HealthKit开放的API是否支持同时获取多个华为手环的健康数据?Q2:当前通过HealthKit获取运动健康数据的功能是否免费?Q3:在联盟平台申请HealthKit权限,上传开发者申请资料清单时,提示“上传失败,请重新上传”,需如何处理?Q4:睡眠记录返回的数据结果与数据类型的字段描述列表对应不上......
  • 【FAQ】运动健康服务端侧数据常见问题及解答
    目录Q1:HealthKit开放的API是否支持同时获取多个华为手环的健康数据?Q2:当前通过HealthKit获取运动健康数据的功能是否免费?Q3:在联盟平台申请HealthKit权限,上传开发者申请资料清单时,提示“上传失败,请重新上传”,需如何处理?Q4:睡眠记录返回的数据结果与数据类型的字段描述列表对应......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • 永久解决matplotlib中文乱码问题
    永久解决matplotlib中文乱码问题1.拷贝Simhei.ttf字体文件至以下目录/root/software/anaconda3/envs/tensorflow/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf#根据自己系统酌情设置2.设置matplotlibrc文件(tensorflow)[root@bigdata~]#python>>>im......
  • 014 springboot2.7.10与swagger3.0.0出现的版本冲突问题,以及解决办法
    springboot2.7.10集成Swagger3.0.0过程中出现的错误提示翻译过来:解决办法:1.网上的解决办法1:在配置文件中添加以下内容spring:mvc:#解决springboot2.7.10与swagger3版本冲突的问题pathmatch:matching-strategy:ant_path_matcher 结果报错,springboot......
  • hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
    解决方案通过将别名.*换成{别名.*}hibernate会自动为我们生成别名,具体修改如下图: ......