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

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

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

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 位的填充。

 

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

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.mzph.cn/pingmian/1204.shtml

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

相关文章

docker-compose 安装MongoDB续:创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

Redis:报错Creating Server TCP listening socket *:6379: bind: No error

错误: window下启动redis服务报错: Creating Server TCP listening socket *:6379: bind: No error 原因: 端口6379已被绑定,应该是因为上次未关闭服务 解决: ①依次输入命令: redis-cli.exe &#xff08…

RAG与LLM本身知识存在冲突时,大模型如何抉择?

原文:https://arxiv.org/pdf/2404.10198.pdf 引言 在人工智能领域,大型语言模型(LLMs)因其强大的语言理解和生成能力而备受关注。然而,这些模型在处理特定问题时可能会产生错误信息,即所谓的“幻觉”&…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法,并完成阶段性改造,包括【传统方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,CNN推理字符】&…

FPGA - 基于自定义AXI FULL总线的PS和PL交互

前言 在FPGA - ZYNQ 基于Axi_Lite的PS和PL交互中,介绍了基于基于AXi_Lite的PL和PS交互,接下来构建基于基于Axi_Lite的PS和PL交互。 AXI_GP、AXI_HP和AXI_ACP接口 首先看一下ZYNQ SoC的系统框图,如下图所示。在图中,箭头方向代表…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务,展示蓝牙相关API用法。实现了以下几点功能: 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描:通过BLE扫描接口实现对…

互联网技术知识点总览——计算机网络知识框架

简介 本文对计算机网络的知识点整体框架进行梳理和分享如下:

【深度学习】写实转漫画——CycleGAN原理解析

1、前言 上一篇,我们讲解了按照指定文本标签生成对应图像的CGAN。本篇文章,我们讲CycleGAN。这个模型可以对图像风格进行转化,并且训练还是在非配对的训练集上面进行的,实用性挺大 原论文:Unpaired Image-to-Image T…

自定义鼠标软件 SteerMouse最新完整激活版

SteerMouse是一款实用的Mac OS X系统辅助工具,可以帮助用户自定义鼠标和触控板的设置,提高使用效率。它提供了多种功能,如自定义按钮、滚轮和光标速度,以及调整灵敏度等,使用户能够根据自己的需求和习惯进行优化。 Ste…

idea 将项目上传到gitee远程仓库具体操作

目录标题 一、新建仓库二、初始化项目三、addcommit四、配置远程仓库五、拉取远程仓库内容六、push代码到仓库七、如果是私有仓库可能会拉取失败(一)需要增加SSH 公钥(二)把远程仓库地址换成ssh的连接八、如果是私有仓库&#xff…

【PCL】教程conditional_euclidean_clustering 对输入的点云数据进行条件欧式聚类分析...

[done, 3349.09 ms : 19553780 points] Available dimensions: x y z intensity 源点云 Statues_4.pcd 不同条件函数output.pcd 【按5切换到强度通道可视化】 终端输出: Loading... >> Done: 1200.46 ms, 19553780 points Downsampling... >> Done: 411…

学习BOM

目录 前言: 1. BOM组成: 1.1Window 对象: 1.1Location 对象: 1.2Navigator 对象: 1.2.1 navigator 对象包含了关于浏览器的信息包括: 1.3History 对象: 1.4常用的history的方法和属性: 1.4Document…

力扣-LCP 02.分式化简

题解: class Solution:def fraction(self, cont: List[int]) -> List[int]:# 初始化分子和分母为 0 和 1n, m 0, 1# 从最后一个元素开始遍历 cont 列表for a in cont[::-1]:# 更新分子和分母,分别为 m 和 (m * a n)n, m m, (m * a n)# 返回最终的…

大型网站系统架构演化实例_9.分布式服务

1. 第十阶段:分布式服务 随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。由于所有应用要和所有数据库系统连接,在数万台服务器规模的网站中,这些连接的数…

计算机网络 -- 多人聊天室

一 程序介绍和核心功能 这是基于 UDP 协议实现的一个网络程序,主要功能是 构建一个多人聊天室,当某个用户发送消息时,其他用户可以立即收到,形成一个群聊。 这个程序由一台服务器和n个客户端组成,服务器扮演了一个接受…

[Kubernetes] etcd的集群基石作用

文章目录 1. 配置存储2. 数据一致性3. 服务发现与协调4. 集群状态中枢5. 集群稳定性 1. 配置存储 etcd作为一个高度可靠的分布式键值存储系统,存储了Kubernetes集群的完整配置和状态数据。集群的元数据,包括节点信息、命名空间、部署、副本集、服务、持…

5.11 mybatis之returnInstanceForEmptyRow作用

文章目录 1. 当returnInstanceForEmptyRowtrue时2 当returnInstanceForEmptyRowfalse时 mybatis的settings配置中有个属性returnInstanceForEmptyRow,该属性新增于mybatis的3.4.2版本,低于此版本不可用。该属性的作用官方解释为:当返回行的所…

使用Python+opencv实现自动扫雷

大家好,相信许多人很早就知道有扫雷这么一款经典的游戏,更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的…

汽车4S集团数据分析

派可数据分析--汽车4S集团。 派可数据汽车4S集团数据分析概述。派可数据汽车4S集团分析主题全面涵盖行业内各板块业务分析,具体包括:保险业务分析、客户关系分析、汽车保养情况分析、售后维修主题分析、整车销售分析、整车库存分析、装具销售分析、配件…