Golang底层原理剖析之内存对齐

简介: Golang底层原理剖析之内存对齐

为什么要内存对齐

假设数据总线64位,每次读取连续的8个字节,所以每次读取的地址一定是8的倍数,如果非要错开一个地址,由于最后一个字节对应的位置与前7个不同,不能在一次读取中读完整,那么就需要分两次读,把两次结果拼接起来拿到所需数据,这必然会影响性能。


如何内存对齐

所以为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址并占用合适的长度,这就是内存对齐,每种类型的对齐值就是它的对齐边界,内存对齐要求数据存储地址以及占用的字节数都要是它的对齐边界的倍数

因此,int32要错开两字节,从4开始存,不能紧接着从2开始,那么,怎么确定每种类型的对齐边界呢?

数据类型的对齐边界,取类型大小与平台最大对其边界(字长)中较小的那个

结构体内存对齐

怎么确定一个结构体的对齐边界呢?首先确定每个成员的对齐边界,假设在64位平台上,取其中成员内存对齐边界中对大的那个,这就是这个结构体的对齐边界

存储这个结构体的起始地址,是对齐边界的倍数,结构体的每个成员在存储时,把这个起始地址当作地址0,然后再用相对地址来决定自己放在哪,a成员要对齐1字节,0%1=0,所以a放在0地址,而b要对齐到八字节 ,但是下面的地址对8取模不等于0,所以b要在8地址存储,而c要对齐到4字节,16%4=0,接下来的位置就刚好,d对齐了2字节,位置也刚好,至此已经用了22个字节了

结构体整体占用字节数需要是结构体类型对齐边界(此处是8)的倍数,不够的话要往后扩张一下,所以它要扩充到相对地址23这里,最终这个结构体类型的大小就是24字节,至此,对齐完成




目录
相关文章
|
3天前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3天前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3天前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
2月前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
19天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
2月前
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
57 0
Golang内存分析工具gctrace和pprof实战
|
2月前
|
算法 NoSQL 关系型数据库
熔断原理与实现Golang版
熔断原理与实现Golang版
|
2月前
|
存储 关系型数据库 Go
SOLID原理:用Golang的例子来解释
SOLID原理:用Golang的例子来解释
|
2月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
2月前
|
Prometheus Cloud Native Java
解决golang 的内存碎片问题
解决golang 的内存碎片问题
52 3