内存对齐的作用

  1. 平台原因(移植):不是所有的硬件平台都可以访问任意位置上的任意数据的,有些硬件只能在特定位置取特定数据。
  2. 性能问题:经过内存对齐,CPU的内存访问速度会提升。因为对齐的元素只需要一次内存访问,未对齐的需要两次。

性能问题

一般程序员会认为内存如下图所示,是有一个个的字节组成,而CPU却不是这样看待的。

CPU把内存当作一块一块的,块的大小可以是2、4、8、16字节大小,因此CPU读取内存是一块一块读取的。(块的大小称为内存读取粒度

假设CPU要读取一个int型4字节大小的数据,分两种情况讨论:

  1. 数据从0字节开始
  2. 数据从1字节开始 假设内存读取粒度为4:

当数据从0字节开始时,CPU只需要读取一次内存即可取到数据。
当数据从1字节开始时,CPU读取数据就变得复杂了,因为数据没有在一个块内存储。这种情况下,CPU先访问内存读取0-3字节数据,在访问内存读取4-7字节数据,然后把0、5、6、7字节的数据去掉,合并1、2、3、4字节数据。这样的操作显然是浪费了很多性能,所以就有了字节对齐,以空间换时间。

内存对齐规则

默认对齐长度:编译器会有一个默认对齐长度,golang 中 64 为系统默认的对齐长度是 8 (这个默认值规则具体不清楚,后面再来补充)

  1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的起始位置必须是默认对齐长度和该数据成员长度中最小的长度的倍数。
  2. 除了结构成员需要对齐,结构本身也需要对齐,结构的长度必须是编译器默认的对齐长度和成员中最长类型中最小的数据大小的倍数对齐。

GO类型对齐

package main
import (
"fmt"
"reflect"
)
type Data struct {
b byte
a int32
x int64
}
type Data1 struct {
b byte
x int64
a int32
}
func main() {
var d Data
t := reflect.TypeOf(d)
fmt.Println(t.Size(),t.Align())
var d1 Data
t1 := reflect.TypeOf(d1)
fmt.Println(t1.Size(),t1.Align())
}
----------
输出结果:
16 8
24 8

上面的内存结构如下所示:

d 的内存结构:

    b---|aaaa|xxxx|xxxx
d1的内存结构: b---|----|xxxx|xxxx|aaaa|----

C 语言对齐规则和 golang 一致,C 语言的默认对齐大小由编译器决定,我们也可以通过以下代码修改默认对齐大小。

pragma pack(2) // 修改默认对齐大小为 2

golang内存对齐相关推荐

  1. Golang 优化之内存对齐

    这里填写标题 1. Golang 优化之内存对齐 1.1. 前文 1.2. 正文 1.2.1. 什么是内存对齐? 1.2.2. 为什么需要内存对齐? 1.2.2.1. 平台原因 1.2.2.2. 性能 ...

  2. 深入Golang内存管理(三) 内存对齐篇

    Go struct 内存对齐 举个例子 type S struct {a boolb int32c int8d int64e byte } 上面的struct S,占用多大的内存? 首先我们按照每个成 ...

  3. Go 内存对齐的那些事儿

    在讨论内存对齐前我们先看一个思考题,我们都知道Go的结构体在内存中是由一块连续的内存表示的,那么下面的结构体占用的内存大小是多少呢? type ST1 struct {A byteB int64C b ...

  4. 内存对齐 | 原来字段顺序还能影响结构体占用的内存空间

    大家好啊,不知道看了网管在上周的文章Go指针的使用限制和unsafe.Pointer突破之路,你们有没有感觉Golang 比之前想的还好用呢?确实能直接读写内存,很多以前觉得无能为力的事情就不再是问题 ...

  5. go-内存管理篇(二) 万字总结-golang内存分配篇

    前言 本文是讲解Golang内存管理的第二篇,在第一篇中我们提到,Golang的内存分配模式与TCMalloc是极其相似的. 所以先来回顾一下TCMalloc相关知识点. Page:TCMalloc也 ...

  6. Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW

    1.总结 对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐.对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而 ...

  7. nginx源码分析--内存对齐处理

    1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐: 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐 ...

  8. Linux下的内存对齐函数

    在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...

  9. C++中的内存对齐介绍

    网上有很多介绍字节对齐或数据对齐或内存对齐的文章,虽然名字不一样,但是介绍的内容大致都是相同的.这里以内存对齐相称.注:以下内容主要来自网络. 内存对齐,通常也称为数据对齐,是计算机对数据类型合法地址 ...

最新文章

  1. mysql主流产品介绍论文_MySQL数据库产品介绍
  2. Project Euler 50 Consecutive prime sum
  3. CSS3 2D和3D转换 Transform
  4. 时间序列分析之:函数分解decompose
  5. 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API
  6. freemarker小例子
  7. java中怎么把生成文件到项目根目录_[SpringBoot2.X] 02- 项目结构介绍
  8. php递归删除空数组,php 递归删除非空文件夹示例
  9. css中的大于号是什么意思 有何作用
  10. Ubuntu14.04开启wifi热点(亲测有效)
  11. 知识表示学习Trans系列梳理(论文+代码)
  12. java spring boot 项目 热加载 有利于快速开发
  13. 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
  14. Axure RP 9 培训讲解---高级免费课程
  15. RHCE认证考试时间是什么时候?
  16. WEB实现百度离线地图展示
  17. 在夜神模拟器内部安装App
  18. 硬盘MBR格式转换GPT
  19. html的版权符号是哪个,HTML版权符号是怎么输入的、代表什么-京标知识产权
  20. Windows网络重置后wifi功能丢失解决方案

热门文章

  1. 【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )
  2. 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )
  3. 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 )
  4. 通过sort()方法实现升序和降序排列
  5. poj 3984
  6. spark 执行流程及各组件执行
  7. 【读书笔记】简约至上-交互式设计四策略
  8. 添加Mysql普通用户来管理hive
  9. android ImageButton的图片怎么定义?
  10. SpannableString