返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 在 Go 中恰到好处的内存对齐
 1 万元的电脑只有 8GB 内存!…
 STM32启动文件startup_stm32…
 内存延迟一键优化技嘉B760M小…
 流光魅影 篇一百二十五:用 …
 显卡大帝黄仁勋不需要美元10…
 耕升 RTX 4060 Ti 追风显卡评…
 什么男人一眼看上去就很穷?
 绝地求生的显卡优化问题
 显卡功耗天梯图NVIDIA
 20款显卡真实待机、满载功耗…
 显卡功耗天梯图中关村2020
 Q1全球IC设计厂商营收排名:…
 山寨芯片+低端面板?六款高端…
 电脑磁盘已满怎么处理?有36…
 磁盘压缩后怎么恢复_c盘压缩…
 交钥匙电源解决方案
 苹果 Mac Pro 掉硬盘
 计算机一级考试内容有哪些科…
 NBF80最小能支持多少斤的显示…
 AOC 27英寸 2K高清 100Hz IP…
 2021年液晶显示器推荐显示屏…
 【质保3年1月换新屏保一年】…
 都市宅族必备华硕超薄壁挂一…
 散热最新资讯-快科技
 轻松解决硬件过热问题游戏帝…
 电脑cpu温度过高怎么解决 cp…
 商贸公司侵权赵露思被强执4万…
 怎样避免台式机过热?上一体…
 有声手账丨【奋进新时代·展…
 适用于网吧主板!精英H61H2-…
 电脑主机主板线怎么插
 雷电接口2014年才会集成在芯…
 就是要占便宜! 14款市售开核…
 组装电脑:内存条的选取内存…
 内存条的英文
 金士顿发布新款 FURY Renega…
 电脑开机蓝屏出现一堆英文
 DDR5内存规范正式发布 2021年…
 玩csgo显卡要求多少合适?CS…
 英特尔停产锐炫A770 16GB限量…
 英伟达介绍 RTX 4060 显卡:…
 NVIDIA郁闷!用了5年的显卡品…
 性能升级价格减半 英特尔A77…
 高端也能平民价!安钛克A200游…
 老外的精品 Antec Neo ECO电…
 千瓦金牌电源10年不保修只换…
 品质出色 安钛克VP450P电源性…
 安钛克电源怎么样?是几线品…
 电脑硬盘装在哪电脑装硬盘去…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
在 Go 中恰到好处的内存对齐
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/6/26 15:42:28 | 【字体:

  岳菁蔚老公这一个结构体的占用内存大小为 1+4+1+8+1 = 15 个字节。相信有的小伙伴是这么算的,看上去也没什么毛病

  最终输出为占用 32 个字节。这与前面所预期的结果完全不一样。这充分地说明了先前的计算方式是错误的。为什么呢?

  在这里要提到 “内存对齐” 这一概念,才能够用正确的姿势去计算,接下来我们详细的讲讲它是什么

  上图表示一个坑一个萝卜的内存读取方式。但实际上 CPU 并不会以一个一个字节去读取和写入内存。相反 CPU 读取内存是一块一块读取的,块的大小可以为 2、4、6、8、16 字节等大小。块大小我们称其为内存访问粒度。如下图:

  在样例中,假设访问粒度为 4。 CPU 是以每 4 个字节大小的访问粒度去读取和写入内存的。这才是正确的姿势

  平台(移植性)原因:不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况

  性能原因:若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作

  在上图中,假设从 Index 1 开始读取,将会出现很崩溃的问题。因为它的内存访问边界是不对齐的。因此 CPU 会做一些额外的处理工作。如下:

  从上述流程可得出,不做 “内存对齐” 是一件有点 “麻烦” 的事。因为它会增加许多耗费时间的动作

  而假设做了内存对齐,从 Index 0 开始读取 4 个字节,只需要读取一次,也不需要额外的运算。这显然高效很多,是标准的空间换时间做法

  在不同平台上的编译器都有自己默认的 “对齐系数”,可通过预编译命令#pragma pack(n)进行变更,n 就是代指 “对齐系数”。一般来讲,我们常用的平台的系数如下:

  另外要注意,不同硬件平台占用的大小和对齐值都可能是不一样的。因此本文的值不是唯一的,调试的时候需按本机的实际情况考虑

  在 Go 中可以调用unsafe.Alignof来返回相应类型的对齐系数。通过观察输出结果,可得知基本都是2^n,最大也不会超过 8。这是因为我手提(64 位)编译器默认对齐系数是 8,因此最大值不会超过这个数

  在上小节中,提到了结构体中的成员变量要做字节对齐。那么想当然身为最终结果的结构体,也是需要做字节对齐的

  接下来我们一起分析一下,“它” 到底经历了些什么,影响了 “预期” 结果

  在每个成员变量进行对齐后,根据规则 2,整个结构体本身也要进行字节对齐,因为可发现它可能并不是2^n,不是偶数倍。显然不符合对齐的规则

  根据规则 2,可得出对齐值为 8。现在的偏移量为 25,不是 8 的整倍数。因此确定偏移量为 32。对结构体进行对齐

  是因为实际内存管理并非 “一个萝卜一个坑” 的思想。而是一块一块。通过空间换时间(效率)的思想来完成这块读取、写入。另外也需要兼顾不同平台的内存操作情况

  在上一小节,可得知根据成员变量的类型不同,其结构体的内存会产生对齐等动作。那假设字段顺序不同,会不会有什么变化呢?我们一起来试试吧 :-)

  通过结果可以惊喜的发现,只是 “简单” 对成员变量的字段顺序进行改变,就改变了结构体占用大小

  接下来我们一起剖析一下Part2,看看它的内部到底和上一位之间有什么区别,才导致了这样的结果?

  根据规则1,其偏移量必须为 1 的整数倍。当前偏移量为 2。不需要额外对齐

  根据规则1,其偏移量必须为 1 的整数倍。当前偏移量为 3。不需要额外对齐

  根据规则1,其偏移量必须为 4 的整数倍。确定偏移量为 4,因此第 3 位为 Padding。而当前数值从第 4 位开始填充,到第 8 位。如下:ecaxbbbb

  根据规则1,其偏移量必须为 8 的整数倍。当前偏移量为 8。不需要额外对齐,从 9-16 位填充 8 个字节。如下:ecaxbbbbdddddddd

  通过对比Part1和Part2的内存布局,你会发现两者有很大的不同。如下:

  仔细一看,Part1存在许多 Padding。显然它占据了不少空间,那么 Padding 是怎么出现的呢?

  通过本文的介绍,可得知是由于不同类型导致需要进行字节对齐,以此保证内存的访问边界

  那么也不难理解,为什么调整结构体内成员变量的字段顺序就能达到缩小结构体占用大小的疑问了,是因为巧妙地减少了 Padding 的存在。让它们更 “紧凑” 了。这一点对于加深 Go 的内存布局印象和大对象的优化非常有帮

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 在 Go 中恰到好处的内存对齐 (06-26)
    普通电脑内存 1 万元的电脑只有 8GB 内存!也就苹果敢Win11… (06-26)
    普通电脑内存 STM32启动文件startup_stm32f10x_hds的代码讲… (06-26)
    普通电脑内存 内存延迟一键优化技嘉B760M小雕WIFI主板助力高… (06-26)
    普通电脑内存 组装电脑:内存条的选取内存条的频率对性能有… (06-26)
    普通电脑内存 内存条的英文 (06-26)
    普通电脑内存 金士顿发布新款 FURY Renegade DDR5 RGB 内存… (06-26)
    普通电脑内存 电脑开机蓝屏出现一堆英文 (06-26)
    普通电脑内存 DDR5内存规范正式发布 2021年亮相最高速度64G… (06-26)
    普通电脑内存 芯原-电子发烧友网 (06-25)
    普通电脑内存 彻底理解虚拟内存:从一个demo看freepstop内存… (06-25)
    普通电脑内存 虚拟内存和物理内存的区别 (06-25)
    普通电脑内存 今日热搜:AI已最让人惊叹的速度进化人类如何… (06-25)
    普通电脑内存 虚拟内存是什么东西有什么作用? (06-25)
    普通电脑内存 Steam Deck有多重 可以插SD内存卡吗? (06-25)
    普通电脑内存 荣耀70系列防水吗 可以加内存吗? (06-25)
    普通电脑内存 iPhone14是满血A15吗 是4G还是6G内存? (06-25)
    普通电脑内存 家人们帮忙看看这个配置的机子还有必要拯救一… (06-25)
    普通电脑内存 内存价格持续下探!海盗船96GB套装仅2699元 (06-25)
    普通电脑内存 小白不懂各位大佬来看一下都在pdd买会踩坑吗 (06-24)