广告
返回顶部
首页 > 资讯 > 数据库 >Go语言是否有必要内存对齐
  • 466
分享到

Go语言是否有必要内存对齐

2024-04-02 19:04:59 466人浏览 安东尼
摘要

这篇文章主要讲解了“Go语言是否有必要内存对齐”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言是否有必要内存对齐”吧!有些同学可能不知道,struct

这篇文章主要讲解了“Go语言是否有必要内存对齐”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言是否有必要内存对齐”吧!

有些同学可能不知道,struct 中的字段顺序不同,内存占用也有可能会相差很大。比如:

type T1 struct {  a int8  b int64  c int16 } type T2 struct {  a int8  c int16  b int64 }

在 64 bit 平台上,T1 占用 24 bytes,T2 占用 16 bytes 大小;而在 32 bit 平台上,T1 占用 16 bytes,T2 占用 12 bytes 大小。可见不同的字段顺序,最终决定 struct 的内存大小,所以有时候合理的字段顺序可以减少内存的开销

这是为什么呢?因为有内存对齐的存在,编译器使用了内存对齐,那么最后的大小结果就会不一样。至于为什么要做对齐,主要考虑下面两个原因:

平台(移植性)

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

性能

若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作,这显然高效很多,是标准的空间换时间做法

有的小伙伴可能会认为内存读取,就是一个简单的字节数组摆放。但实际上 CPU 并不会以一个一个字节去读取和写入内存,相反 CPU 读取内存是一块一块读取的,块的大小可以为 2、4、6、8、16 字节等大小,块大小我们称其为内存访问粒度。假设访问粒度为 4,那么 CPU 就会以每 4 个字节大小的访问粒度去读取和写入内存。

在不同平台上的编译器都有自己默认的 “对齐系数”。一般来讲,我们常用的 x86 平台的系数为 4;x8664 平台系数为 8。需要注意的是,除了这个默认的对齐系数外,还有不同数据类型的对齐系数。数据类型的对齐系数在不同平台上可能会不一致。例如,在 x8664 平台上,int64 的对齐系数为 8,而在 x86 平台上其对齐系数就是 4。

还是拿上面的 T1、T2 来说,在 x86_64 平台上,T1 的内存布局为:

T2 的内存布局为(int16 的对齐系数为 2):

仔细看,T1 存在许多 padding,显然它占据了不少空间。那么也就不难理解,为什么调整结构体内成员变量的字段顺序就能达到缩小结构体占用大小的疑问了,是因为巧妙地减少了 padding 的存在。让它们更 “紧凑” 了。

其实内存对齐除了可以降低内存占用之外,还有一种情况是必须要手动对齐的:在 x86 平台上原子操作 64bit 指针。之所以要强制对齐,是因为在 32bit 平台下进行 64bit 原子操作要求必须 8 字节对齐,否则程序会 panic

感谢各位的阅读,以上就是“Go语言是否有必要内存对齐”的内容了,经过本文的学习后,相信大家对Go语言是否有必要内存对齐这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言是否有必要内存对齐

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

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

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

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

下载Word文档
猜你喜欢
  • Go语言是否有必要内存对齐
    这篇文章主要讲解了“Go语言是否有必要内存对齐”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言是否有必要内存对齐”吧!有些同学可能不知道,struct...
    99+
    2022-10-18
  • 详解Go语言中的内存对齐
    目录前言基础知识看个问题什么是内存对齐为什么需要内存对齐unsafe.AlignOf()内存对齐规则举个例子空结构体的对齐规则总结前言 前面有篇文章我们学习了 Go 语言空...
    99+
    2022-11-11
  • go语言必须要有的包是什么
    本篇内容介绍了“go语言必须要有的包是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言必须有一个main包。Go语言是编译型的静态...
    99+
    2023-07-04
  • go语言的形参是否占用内存
    本篇内容主要讲解“go语言的形参是否占用内存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言的形参是否占用内存”吧!形参变量在未出现函数调用时并不占用内存,只在调用时才占用,调用结束后将释...
    99+
    2023-07-04
  • 为什么Go语言有时也需要考虑对齐的问题
    本篇文章给大家分享的是有关为什么Go语言有时也需要考虑对齐的问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。CPU 访问内存时,并不是逐个字...
    99+
    2022-10-19
  • Go语言开发必知的一个内存模型是什么
    这篇文章主要介绍“Go语言开发必知的一个内存模型是什么”,在日常操作中,相信很多人在Go语言开发必知的一个内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言开发必知的一个内存模型是什么”的疑...
    99+
    2023-07-02
  • Django框架还有存在的必要吗?GO语言是更好的选择吗?
    随着GO语言的流行,许多人开始质疑Django框架的必要性。虽然GO语言确实在性能和并发方面优于Python,但是它是否真的能够替代Django框架呢?在本文中,我们将探讨这个问题并给出答案。 首先,让我们看看Django框架的优势。Dj...
    99+
    2023-08-02
    关键字 django 框架
  • 存储数组时,Go语言中哪些关键字是必须要了解的?
    在Go语言中,存储数组是一种非常常见的操作。在进行存储数组操作时,有一些关键字是必须要了解的,这些关键字可以帮助我们更好地进行数组的存储和操作。本文将介绍Go语言中存储数组时必须要了解的关键字,并演示一些相关的代码。 一、var关键字 在G...
    99+
    2023-09-23
    关键字 存储 数组
  • 存储和自然语言处理:Go和Bash是否是一对完美组合?
    Go和Bash是两种不同的编程语言,它们各有优点,其中Go是一种现代化的编程语言,它以高效、简洁和可靠著称,而Bash则是一种广泛使用的Unix shell,它是一种解释器,可以用于执行一些命令和脚本。在存储和自然语言处理方面,Go和Ba...
    99+
    2023-11-01
    bash 存储 自然语言处理
  • 是否有一种基于自然语言处理的存储方式比Go和Bash更好?
    随着大数据时代的到来,数据的存储和处理成为了一个越来越重要的问题。传统的存储方式,如Go和Bash,已经无法满足当今海量数据处理的需求。因此,人们开始探索一种基于自然语言处理的存储方式,以提高数据处理效率和准确性。 在传统的存储方式中,我们...
    99+
    2023-11-01
    bash 存储 自然语言处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作