Go语言中通过数据对齐降低内存消耗和提升性能

embedded/2024/10/19 17:21:08/

数据对齐是一种安排数据分配方式以加速 CPU 访问内存的方法。 不了解这个概念会导致额外的内存消耗甚至性能下降。

要了解数据对齐的工作原理,让我们首先讨论没有它会发生什么。假设我们分配两个变量,一个 int32 类型的 (32 B) 和一个 int64类型的(64 B):

Go">var i int32
var j int64

在没有数据对齐的情况下,在 64 位架构上,这两个变量的分配方式如下图所示,j 变量可以被分配在两个字上。 如果 CPU 想要读取 j,它需要两次内存访问而不是一次。

 为了防止发生这种情况,变量的内存地址应该是其自身大小的倍数,这就是数据对齐的概念。在 Go 中,对齐可保证如下事项:

  • byte, uint8, int8: 占用 1 B
  • uint16, int16: 占用 2 B
  • uint32, int32, float32: 占用 4 B
  • uint64, int64, float64, complex64: 占用 8 B 
  • complex128: 占用 16 B

 所有这些类型都保证对齐的方式: 它们的地址是它们大小的倍数。例如,任何 int32 类型的变量的地址都是 4 的倍数。

让我们回到现实世界。下图显示了  i 和 j 在内存中分配的两种不同情况。

在第一种情况下,在 i 之前分配了一个 32 位的变量。因此, i 和 j 是连续分配的。在第二种情况下, 32 位的变量在 i  之前没有被分配 (比如是 64 位的变量); 所以,i 被分配在一个字的开头。为了遵循从数据对齐 (地址是 64 的倍数),j 不能与 i 一起被分配,而是被分配给下一个 64 的倍数。 灰色框表示 32 位的填充。

 

接下来,让我们看看填充何时会成为问题。我们将考虑以下包含三个字段的结构:

Go">type Foo struct {b1 bytei  int64b2 byte
}

我们有一个字节类型(1 B)、一个 int64 (8 B)类型和另一个字节类型 (1 B)。在64位架构上,结构体在内存中的分配如下图所示。b1 首先被分配。因为 i 是一个 int64 类型的,它的地址必须是 8 的倍数。因此,不可能将它与 b1 一起分配在 0x01 。 8的倍数的下一个地址是什么?0x08。b2 被分配给下一个可用地址,它是 1 的倍数:0x10。

 


http://www.ppmy.cn/embedded/6070.html

相关文章

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件,包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术,以准确预测时空数据,但重要的是要注意…

NVIC简介

NVIC(Nested Vectored Interrupt Controller)是ARM处理器中用于中断管理的一个重要硬件模块。它负责处理来自多个中断源的中断请求,并根据中断的优先级来安排处理器执行相应的中断服务例程(ISR)。NVIC是ARM Cortex-M系…

OSPF的P2P和Broadcast

OSPF为什么会有P2P和BROADCAST两种类型 OSPF(开放最短路径优先)协议中存在P2P(点对点)和BROADCAST(广播多路访问)两种网络类型,主要是为了适应不同类型的网络环境和需求。具体分析如下&#xf…

WPF中TextBox失去焦点事件

限制TextBox只能输入整数&#xff0c;而且整数的数值范围为0-100。如果输入101后&#xff0c;弹窗提示输入超限 MainWindow.xaml <TextBox x:Name"textBox1" TextWrapping"Wrap" Text"TextBox" Width"120" Height"50" Lo…

【论文笔记 | 异步联邦】Asynchronous Federated Optimization

论文信息 Asynchronous Federated Optimization&#xff0c;OPT2020: 12th Annual Workshop on Optimization for Machine Learning&#xff0c;不属于ccfa introduction 背景&#xff1a;联邦学习有三个关键性质 任务激活不频繁&#xff08;比较难以达成条件&#xff09;&…

六边形酷科技特效单页源码

源码介绍 基于canvas画布绘制多个六边形追踪鼠标&#xff0c;科技感的几何图形酷炫动画特效&#xff0c; 单页html源码&#xff0c;可以做网站动态背景&#xff0c;喜欢的朋友可以拿去 效果截图 完整源码 <!doctype html> <html> <head> <meta charset…

Python的pytest框架(2)--断言机制

接上篇文章&#xff0c;我们使用pytest框架&#xff0c;实现自动发现并执行用例&#xff0c;接着利用断言语句判断测试结果&#xff0c;最后生成报告。这篇文章我们就断言机制来展开&#xff0c;深入学习进阶pytest框架的断言机制&#xff1a; 目录 一、基本断言 使用Python…

HBase的数据模型与架构

官方文档&#xff1a;Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文&#xff0c;HBase建立在Hadoop之上&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于…