美文网首页
Golang 内存对齐问题

Golang 内存对齐问题

作者: fanlv | 来源:发表于2018-10-16 20:52 被阅读84次

什么是内存对齐?

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

sda.png

假设CPU访问粒度是4,也就是一次性可以读取内存中的四个字节内容;当我们不采用内存对齐策略,如果需要访问A中的b元素,CPU需要先取出0-3四个字节的内容,发现没有读取完,还需要再次读取,一共需要进行两次访问内存的操作;而有了内存对齐,参考左图,可一次性取出4-7四个字节的元素也即是b,这样就只需要进行一次访问内存的操作。所以操作系统这样做的原因也就是所谓的拿空间换时间,提高效率。

为什么要内存对齐?

会了关于结构体内存大小的计算,可是为什么系统要对于结构体数据进行内存对齐呢,很明显所占用的空间大小要更多。原因可归纳如下:

  1. 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  2. 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

Golang 字节对齐

最近在做一个需求的时候,有个场景,需要一个线程定时去更新一个全局变量指针地址,然后在另外的线程可以读取这个变量的数据,同事在帮忙Review代码的时候,问这个多线程操作这个全局指针变量时候需不需要加锁,因为在C/C++中有内存对齐问题,如果指针是内存对齐的,是可以不加锁的。所以下面测试下golang的内存是否会做自动对齐的操作。

测试一

    //输出长度为1
   fmt.Printf("%d",unsafe.Sizeof(struct {
       i8  int8
   }{}))

测试二

    //输出长度为16
   fmt.Printf("%d",unsafe.Sizeof(struct {
       i8  int8
       p   *int8
   }{}))

在测试二中可以看出, 在后面申明一个指针以后,内存空间自动扩容为16了,说明编译自动帮我们做了内存对齐。

参考文献

http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html

https://www.zhihu.com/question/27862634

https://blog.csdn.net/sssssuuuuu666/article/details/75175108

https://my.oschina.net/u/2950272/blog/1829197

https://www.jianshu.com/p/cb40c746bf9e

相关文章

  • Golang 内存对齐问题

    什么是内存对齐? CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一...

  • golang 和 C++ 的内存对齐

    golang 和 C++的内存对齐,基本一致,记住规则和对应类型的 size 即可 内存对齐规则 有效对齐值是固定...

  • Golang内存对齐

    如何得到一个对象所占内存大小? 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。...

  • 【Golang】内存对齐

    欢迎关注微信公众号:全栈工厂 1. 先看一个问题 请思考30秒想想以下代码输出的内容是多少? 执行后代码输出: 你...

  • golang内存对齐

    1.golang内存对齐保证 typealign 保证bool,type,uint8,int81个字节uint16...

  • golang - 内存对齐

    1. 介绍 CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块...

  • 内存对齐

    本次主要讨论三个问题: 什么是内存对齐 内存对齐的好处 如何对齐 内存对齐 内存对齐是一种提高内存访问速度的策略。...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

  • 内存对齐

    原文:【Golang】这个内存对齐呀!?_哔哩哔哩_bilibili[https://www.bilibili.c...

  • golang的内存对齐

    什么是内存对齐 此时的 打印值为:16,一个64长度int占8字节,两个就是16。 此时的 打印值为:16,4+8...

网友评论

      本文标题:Golang 内存对齐问题

      本文链接:https://www.haomeiwen.com/subject/kyrkzftx.html