结构体的对其规则以及为什么要对其

2023-05-16

结构体的内存对齐规则以及为什么要对齐

内存对齐规则

1. 第一个成员在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
(VS中默认的值为83. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍
处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数
倍。

为什么存在内存对齐?

1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据
的;某些硬件平台只能 在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在
于,为了访问未对齐的 内存,处理器需要作两次内存访问;而对齐的内存访问
仅需要一次访问。
总体来说:
结构体的内存对齐是拿空间来换取时间的做法。

举例:

//有一个如下的结构体:

struct A{

 	long a1;

 	short a2;

 	int a3;

 	int *a4;

};

//请问在64位编译器下用sizeof(struct A)计算出的大小是多少?( )
/*
  首先明确,64位下指针大小为8个字节,这是关键,a1占4字节,a2两字节,
由于a3占4字节,  a2需要补齐2个字节,对于a1,a2,a3一共开辟了12个字
节,由于a4占8个字节,所以a3之后要  补齐4个字节才能是8的整数倍,最
后总和为24字节,刚好也是8的倍数,所以最终结构体大小为  24字节

  其次,32位下指针大小为4字节,a1占用4字节,a2占用2字节,a3字节数为4,
应对齐到4的整数倍8,故需要在a2后补充两个字节,a4字节大小为4,刚好在字
节偏移12处存储,故最终的结构体大小为16字节。

*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体的对其规则以及为什么要对其 的相关文章

  • 精密单点定位技术(PPP)和RTK技术有什么区别

    首先用通俗的话来说 xff0c RTK是先架设一个基站 xff0c 基站把自己的误差是多少告诉我 xff0c 我再用这个误差项去消除自己移动站的误差 而PPP不用我们自己架设基站 xff0c 已经有一些基础的基站 xff0c 通过卫星发送的
  • ubuntu network manager 网络需要手工重启解决

    乌班图的无线和网络需要手工 sudo service network manager restart才可以搜索到 其实主要是我手工编辑了 etc network interface 修改的方法就是在 etc NetworkManager N
  • C#垃圾回收GC机制

    https www cnblogs com yzl050819 p 6245463 html 可以参考这篇文章的内容 程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的 垃圾收集器检查不在被应用程序使用的对象 它认为这些条件是符合清
  • 编译xlslib 测试写入中文

    1下载xlslib库 https sourceforge net projects xlslib source 61 directory 我下载的是 xlslib package 2 5 0 zip 解压 在xlslib xlslib bu
  • 电商API:拍立淘图片搜索

    item search img 按图搜索淘宝商品 xff08 拍立淘 xff09 查看演示 onebound taobao item search img 请求参数 xff1a imgid 61 http g search3 alicdn
  • Qt的UI布局以及控件间隔(Spacing)边距(Margins)

    替一个Widget设置布局有两种方法 1layout 构造函数传递QWidget QVBoxLayout MainQVboxLayout 61 new QVBoxLayout MainWidget 2layout构造函数传递NULL xff
  • 让Qt自定义窗口边界可以拉伸

    qt去掉外边框以后 边界不能拉伸 第一 根据mouseevent事件到达边界的时候自己处理 通过resize 来设置 这种需要写的代码较多 windows平台上有更简版的方法 处理winevent里面的 WM NCHITTEST switc
  • 最新uboot的Kbuild系统 3 .config的生成

    前面的工作产生了一个conf 关键点是由conf产生 config的过程 最后是通过执行 scripts kconfig conf defconfig 61 arch configs rpi defconfig Kconfig 生成的 Kc
  • linux下IDA安装使用

    http www hexblog com p 61 958 sudo dpkg add architecture i386 sudo apt get update sudo apt get install libc6 i686 i386 l
  • RK3288的几种USB模式

    RK3288启动后有三种模式 xff0c 可以分别进行操作 一种是normal也就是正常的启动模式 这个模式无法刷固件 一般板子通电就是这个模式 第二种是loader模式 就是刷固件模式 这个模式可以刷各种image 按住recover按键
  • (导数)微分与积分的概念

    1导数定义 2微分 微分可以看作 y在自变量增量x 处在一个极小值deta x下的变化值的线性主部 微分指的是dy dy和deta Y有一个极小的增量也就是图5 9中的Q Q 39 xff0c 这一部分可以忽略不计 所以是微分 dy 是de
  • android sdk license问题

    You have not accepted the license agreements of the following SDK components Checking the license for package CMake 3 6
  • git还原某个文件到特定的版本

    转载自 https www cnblogs com qianxinxu p 7159739 html 场景 xff1a 对于某个Git控制下的文件进行了修改 xff0c 但是改的不满意 xff0c 想退回到改之前的版本 假定该文件为 src
  • frida初探1

    frida包括客户端和服务 服务运行在windows上面 通过Pip install frida安装 安装比较慢的话 直接下载frida 12 6 13 tar 执行 python setup py install 然后会要继续下载 fri
  • 常见PCB封装图解

    常用集成电路芯片封装图 doc文档可能在WAP端浏览体验不佳 建议您优先选择TXT xff0c 或下载源文件到本机查看 PCB 元件库命名规则 2 1 集成电路 xff08 直插 xff09 用 DIP 引脚数量 43 尾缀来表示双列直插封
  • visual studio 里面解决方案资源管理器界面不见了,应该如何显示出来?并且如何将其从右边更改到左边

    1 打开visual studio 软件 出现的界面没有 解决方案资源管理器界面 xff0c 如下图所示 xff1a 2 点击顶部的 视图 菜单 xff0c 如下图所示 xff1a 3 打开 视图 后 xff0c 会出现 解决方案资源管理器
  • 雾化器工作原理

    水位控制和偏置电路 电路中的超声换能器 xff34 xff24 xff08 又称雾化头 xff09 和其上 安装的两根水位控制触针 xff0c 他们是浸没在浅水水溶液中工作的 若长期雾化 xff0c 一旦液面降低而使雾化头的水位控制触针露出
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    PS xff1a 大学开始写博客 xff0c 写了三年了 xff0c 虽然大二太忙了 xff0c 专业知识学的潦草 xff0c 也没写太多博客 大三开始写专业课的复习笔记 xff0c 没想到这一篇博文浏览和点赞这么高 xff0c 心里还是挺
  • 马原复习笔记(老师勾画的重点以及相应的习题练习)

    天呐 xff0c 我竟然会来复习马原 xff1f 那必须的 xff01 一心向党 xff0c 争做社会主义好青年 xff0c 当然了 xff0c 这玩意和思修 近代史不一样 xff0c 不记点东西编都不好编是吧 xff0c 加上和之前毛概不
  • zigbee通讯技术复习笔记

    这门课对于我一个学嵌入式的来说 xff0c 还是比较重要的 xff0c 所以我还是以老师给出的大纲为主体 xff0c 好好复习一下 xff01 题型 xff1a 选择题24x1 5 判断10x1 填空15x1 简答4x5 程序1x5 另外一

随机推荐