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

news/2024/10/19 21:35:56/

数据对齐是一种安排数据分配方式以加速 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 在内存中分配的两种不同情况。

<

http://www.ppmy.cn/news/1426957.html

相关文章

SpringCloud系列(7)--Eureka服务端的安装与配置

前言&#xff1a;上一章节我们介绍了Eureka的基础&#xff0c;本章节则介绍Eureka服务端的安装与配置 Eureka架构原理图 1、创建Eureka Server端服务注册中心模块 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 (3)填写子模块的名称&#xf…

【架构-15】NoSQL数据库

NoSQL&#xff08;Not Only SQL&#xff09;数据库是一类非关系型数据库&#xff0c;与传统的关系型数据库&#xff08;如MySQL、Oracle&#xff09;相对而言。NoSQL数据库的设计目标是针对大规模数据和高并发访问的需求&#xff0c;具有高可扩展性、高性能和灵活的数据模型。 …

C++ 抽象

关键字&#xff1a;virtual 在C中可以使用关键字 virtual将函数声明为抽象函数&#xff0c;从而对类进行抽象&#xff1b;至少有一个成员函数为抽象函数的类将被视为抽象类。抽象类无法进行实例化&#xff0c;因而抽象类在C中一般是为了给其他类提供一个可以继承的适当的基类作…

掌握ChatGPT写作技巧

ChatGPT无限次数:点击直达 掌握ChatGPT写作技巧 ChatGPT是一种基于大规模预训练模型的自然语言处理工具&#xff0c;能够模拟人类的对话风格&#xff0c;帮助用户生成高质量的文章、对话和文字内容。掌握ChatGPT的写作技巧对于提升文章质量和效率具有重要意义。本文将介绍如何…

Axios的简明教程

Axios是什么&#xff1f; Axios是一个基于promise的HTTP客户端&#xff0c;可以在浏览器和node.js中使用。它提供了一种简单的方法来发送异步HTTP请求。与其他HTTP库&#xff08;如Fetch&#xff09;相比&#xff0c;Axios提供了更丰富的功能和更好的错误处理。例如&#xff0…

linux实用C++库之日志

目录 1 介绍2 内容 1 介绍 本博客用来记录linux下日志库的基本使用。 2 内容 安装&#xff1a; 使用&#xff1a; CMakeLists.txt编写&#xff1a;

Spring项目日期数据的类型转换

前言 需要用到工具类SimpleDateFormat 1. 哪个依赖类提供&#xff1a; SimpleDateFormat 是 Java 标准库中的一个类&#xff0c;属于 java.text 包。它不依赖于外部库&#xff0c;是 Java 核心 API 的一部分。 2. 原理解释&#xff1a; SimpleDateFormat 是 java.text.Dat…

javase__进阶 day13stream流和方法引用

1.不可变集合 1.1 什么是不可变集合 ​ 是一个长度不可变&#xff0c;内容也无法修改的集合 1.2 使用场景 ​ 如果某个数据不能被修改&#xff0c;把它防御性地拷贝到不可变集合中是个很好的实践。 ​ 当集合对象被不可信的库调用时&#xff0c;不可变形式是安全的。 简单…