iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang内存对齐的概念是什么
  • 279
分享到

golang内存对齐的概念是什么

2023-06-29 01:06:06 279人浏览 八月长安
摘要

这篇文章主要介绍“golang内存对齐的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存对齐的概念是什么”文章能帮助大家解决问题。什么是内存对齐为保证程序顺利高效的运行,编译

这篇文章主要介绍“golang内存对齐的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存对齐的概念是什么”文章能帮助大家解决问题。

什么是内存对齐

为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址,并占用合适的长度,这就是内存对齐。

每种类型的对齐值就是它的对齐边界,内存对齐要求数据存储地址以及占用的字节数都要是它的对齐边界的倍数。所以下述的int32要错开两个字节,从4开始存,却不能紧接着从2开始。

golang内存对齐的概念是什么

也可以这样解释:

CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度)。

如果不进行内存对齐

比如我们想从地址1开始读8字节的数据:

golang内存对齐的概念是什么

CPU会分两次读:

  • 第一次从 0 - 7 但只取后 7 字节。

  • 第二次从 8 - 15 但只取第 1 字节。

分两次读,这样势必会对性能造成影响。

为什么要内存对齐

原因主要有两点:

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

  • 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

对齐边界

那该怎么确定每种数据的对齐边界呢?这和平台有关,go语言支持这些平台:

可以看到常见的32位平台,指针宽度和寄存器宽度都是4字节,64位平台上都是8字节。而被go语言称为寄存器宽度的这个值,就可以理解为机器字长,也是平台对应的最大对齐边界。

golang内存对齐的概念是什么

而数据类型的对齐边界,是取类型大小与平台最大对齐边界中较小的那个。不过要注意,同一个类型在不同平台上,大小可能不同,对齐边界也可能不同。

golang内存对齐的概念是什么

为什么不统一使用平台最大对齐边界呢?或者统一按各类型大小来对齐呢?

我们来试一下,假设目前是64位平台,最大对齐边界为8字节。int8只有1字节,按照1字节对齐的话,它可以放在任何位置,因为总能通过一次读取把它完整拿出来。如果统一对齐到8字节,虽然同样只要读取一次,但每个int8的变量都要浪费7字节,所以对齐到1。

golang内存对齐的概念是什么

int16占2字节,按照2字节对齐,可以从这些地址开始存,而且能保证只用读取一次。

golang内存对齐的概念是什么

如果按1字节对齐就可能存成这样,那就要读取两次再截取拼接,会影响性能。

golang内存对齐的概念是什么

如果按8字节对齐,会与int8一样浪费内存,所以对齐到2。

这是小于最大对齐边界的情况,再来看看大于的情况。

假设要在32位的平台下存储一个int64类型的数据,在0和1位置被占用的情况下,就要从位置8开始存。而如果对齐到4,就可以从位置4开始,内存浪费更少,所以选择对齐到4。

golang内存对齐的概念是什么

因此类型对齐边界会这样选择,依然是为了减少浪费提升性能。

golang内存对齐的概念是什么

GO 计算对齐边界函数

在go语言中可以调用 unsafe.Alignof 来返回相应类型的对齐边界:

func main() {fmt.Printf("bool align: %d\n", unsafe.Alignof(bool(true)))fmt.Printf("int32 align: %d\n", unsafe.Alignof(int32(0)))fmt.Printf("int8 align: %d\n", unsafe.Alignof(int8(0)))fmt.Printf("int64 align: %d\n", unsafe.Alignof(int64(0)))fmt.Printf("byte align: %d\n", unsafe.Alignof(byte(0)))fmt.Printf("string align: %d\n", unsafe.Alignof("EDDYCJY"))fmt.Printf("map align: %d\n", unsafe.Alignof(map[string]string{}))}

运行结果:

bool align: 1
int32 align: 4
int8 align: 1
int64 align: 8
byte align: 1
string align: 8
map align: 8

确定结构体的对齐边界

对结构体而言,首先要确定每个成员的对齐边界,然后取其中最大的,这就是这个结构体的对齐边界。

golang内存对齐的概念是什么

然后来存储这个结构体变量:

内存对齐要求一:

  • 存储这个结构体的起始地址,是对齐边界的倍数。

假设从0开始存,结构体的每个成员在存储时,都要把这个起始地址当作地址0,然后再用相对地址来决定自己该放在哪里。

内存对齐要求2:

  • 结构体整体占用字节数需要是类型对齐边界的倍数,不够的话要往后扩张一下。

所以最终上述结构体类型的大小就是24字节。

案例

type Part1 struct {a boolb int32c int8d int64e byte}
type Part2 struct {a boolc int8e byteb int32 // 4个字节d int64}

分别求以上两个结构体占用的字节:

fmt.Printf("part1 size: %d, align: %d\n", unsafe.Sizeof(part1), unsafe.Alignof(part1))fmt.Printf("part2 size: %d, align: %d\n", unsafe.Sizeof(part2), unsafe.Alignof(part2))

这里我们直接调用函数求得:

part1 size: 32, align: 8part2 size: 16, align: 8

关于“golang内存对齐的概念是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网GO频道,小编每天都会为大家更新不同的知识点。

您可能感兴趣的文档:

--结束END--

本文标题: golang内存对齐的概念是什么

本文链接: https://www.lsjlt.com/news/321879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang内存对齐的概念是什么
    这篇文章主要介绍“golang内存对齐的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang内存对齐的概念是什么”文章能帮助大家解决问题。什么是内存对齐为保证程序顺利高效的运行,编译...
    99+
    2023-06-29
  • golang内存对齐的概念及案例详解
    什么是内存对齐 为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址,并占用合适的长度,这就是内存对齐。 每种类型的对齐值就是它的对齐边界,内存对齐要求数据存储地址以及...
    99+
    2024-04-02
  • JavaScript内置对象的概念是什么
    这篇“JavaScript内置对象的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2024-04-02
  • Java内存模型的概念是什么
    这篇文章主要介绍了Java内存模型的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java内存模型的概念是什么文章都会有所收获,下面我们一起来看看吧。内存模型,英文名Memory Model,他是一个...
    99+
    2023-06-02
  • linux物理内存的概念是什么
    这篇文章主要介绍“linux物理内存的概念是什么”,在日常操作中,相信很多人在linux物理内存的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux物理内存的...
    99+
    2023-03-02
    linux
  • golang内存对齐对性能的影响
    golang中内存对齐优化了内存访问,好处包括降低访问时间、提高缓存命中率、防止数据错误。通过手动调整对齐方式,如示例中的将int32字段对齐到8字节,可以提高代码处理大量数据的性能。 ...
    99+
    2024-04-23
    golang 内存对齐
  • golang中map的概念是什么
    本文小编为大家详细介绍“golang中map的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中map的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在golang中,map是一种...
    99+
    2023-07-04
  • golang闭包的概念是什么
    闭包是指一个函数值(函数的指针)与其引用的其环境变量(值)的组合,形成了一个整体。换句话说,闭包是一个包含自由变量(在函数中使用,但...
    99+
    2023-10-20
    golang
  • DOM对象的概念是什么
    今天小编给大家分享一下DOM对象的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2024-04-02
  • php对象的概念是什么
    PHP对象是PHP中的一种数据类型,它可以被看作是具有属性和方法的实体。对象是基于类的实例化,类是一个定义对象属性和方法的模板。对象...
    99+
    2023-10-18
    php
  • Linux内存管理和寻址的概念是什么
    本篇内容主要讲解“Linux内存管理和寻址的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存管理和寻址的概念是什么”吧!1.概念内存管理模式段式:内存分为了多段,每段都是连...
    99+
    2023-06-21
  • C++基本组件之内存池的概念是什么
    这篇文章主要介绍了C++基本组件之内存池的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++基本组件之内存池的概念是什么文章都会有所收获,下面我们一起来看看吧。内存池概念尽量减少malloc的次数频...
    99+
    2023-07-05
  • golang协程调度的概念是什么
    Golang中的协程调度是指Goroutine(Go语言中的轻量级线程)的调度和执行过程。Golang使用了一种称为M:N调度的模型...
    99+
    2023-10-26
    golang
  • html5中web储存的概念是什么
    这篇文章主要介绍了html5中web储存的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇html5中web储存的概念是什么文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • golang闭包的概念及作用是什么
    闭包是指一个函数(匿名函数或者lambda函数)以及其相关的引用环境组合而成的实体。在Go语言中,闭包是一种特殊的匿名函数,它可以访...
    99+
    2024-02-29
    golang
  • Golang函数的内存对齐和内存分配器的效率比较
    Golang作为一门高效、快速、安全的静态编程语言,不仅拥有简单易用的语法结构和丰富的标准库,还具备强大的内存管理能力。在Golang中,函数的内存对齐和内存分配器的效率是非常重要的,因为它们直接影响着程序的性能以及运行效率。内存对齐是指将...
    99+
    2023-05-17
    Golang 内存对齐 内存分配器
  • python中面向对象的概念是什么
    面向对象的概念是一种编程范式,它将数据和操作数据的方法打包在一起,形成对象。对象是类的实例,类是用来描述相似对象的模板。面向对象的编...
    99+
    2023-10-12
    python
  • sdk的概念是什么
    本文小编为大家详细介绍“sdk的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“sdk的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。sdk全称“Software Development Ki...
    99+
    2023-07-04
  • servlet的概念是什么
    这篇文章主要介绍了servlet的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇servlet的概念是什么文章都会有所收获,下面我们一起来看看吧。Servlet全称“Java Servlet”,中文意...
    99+
    2023-07-05
  • mysql.sock的概念是什么
    这篇文章主要讲解了“mysql.sock的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql.sock的概念是什么”吧! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作