golang 内存对齐和填充规则
内存对齐和填充规则
-
对齐要求:每个数据类型的起始地址必须是其大小的倍数。
int8(1字节):不需要对齐。int16(2字节):起始地址必须是2的倍数。int32(4字节):起始地址必须是4的倍数。int64(8字节):起始地址必须是8的倍数。
-
填充规则:如果当前偏移量不是下一个成员变量对齐要求的倍数,则编译器会在前一个成员后插入“填充字节”,以使下一个成员的起始地址满足对齐要求。
-
结构体总大小:结构体的总大小必须是其最大成员对齐大小的倍数,必要时会在结构体末尾添加额外的填充字节。
示例解析
示例 1:未优化的结构体
type Unoptimized struct {a int8 // 1 byteb int32 // 4 bytes, 需要4字节对齐c int16 // 2 bytes, 需要2字节对齐
}
- a 占用 1 字节,起始地址为 0。
- b 需要 4 字节对齐,但
a只占用了 1 字节,因此在a后面需要填充 3 字节,使得b的起始地址为 4。 - c 需要 2 字节对齐,
b占用 4 字节,所以c的起始地址为 8,不需要额外填充。 - 结构体总大小为 10 字节(1 + 3 + 4 + 2),但为了使结构体大小为 4 字节对齐(最大成员
b是 4 字节对齐),需要在末尾再填充 2 字节。
最终结构体大小为 12 字节。
示例 2:优化后的结构体
type Optimized struct {b int32 // 4 bytes, 需要4字节对齐c int16 // 2 bytes, 需要2字节对齐a int8 // 1 byte, 不需要对齐
}
- b 占用 4 字节,起始地址为 0,符合 4 字节对齐。
- c 需要 2 字节对齐,
b占用 4 字节,所以c的起始地址为 4,不需要额外填充。 - a 占用 1 字节,
c占用 2 字节,所以a的起始地址为 6,不需要额外填充。 - 结构体总大小为 7 字节(4 + 2 + 1),但为了使结构体大小为 4 字节对齐(最大成员
b是 4 字节对齐),需要在末尾再填充 1 字节。
最终结构体大小为 8 字节。
图解填充规则
假设我们有一个结构体:
type Example struct {a int8 // 1 byteb int16 // 2 bytesc int32 // 4 bytes
}
我们可以用图来表示内存布局:
Offset: 0 1 2 3 4 5 6 7 8 9 10 11+--+--+--+--+--+--+--+--+--+--+--+--+| a| P| P| P| b| b| P| P| c| c| c| c|+--+--+--+--+--+--+--+--+--+--+--+--+
a占用 1 字节,后面填充 3 字节(P 表示填充字节)。b占用 2 字节,后面填充 2 字节。c占用 4 字节。
调整顺序后:
type Example struct {c int32 // 4 bytesb int16 // 2 bytesa int8 // 1 byte
}
内存布局变为:
Offset: 0 1 2 3 4 5 6 7+--+--+--+--+--+--+--+--+| c| c| c| c| b| b| a| P|+--+--+--+--+--+--+--+--+
c占用 4 字节。b占用 2 字节。a占用 1 字节,后面填充 1 字节。
最终结构体大小为 8 字节,比原来的 12 字节更紧凑。
总结
通过将占用较大内存空间的成员放在前面,可以减少编译器为了对齐而插入的填充字节数量,从而使结构体更加紧凑,节省内存。你可以使用 unsafe.Sizeof() 和 unsafe.Alignof() 来验证这些结构体的实际大小和对齐方式。
相关文章:
golang 内存对齐和填充规则
内存对齐和填充规则 对齐要求:每个数据类型的起始地址必须是其大小的倍数。 int8(1字节):不需要对齐。int16(2字节):起始地址必须是2的倍数。int32(4字节):起…...
【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践
YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档: 单机(主备)部署 | YashanDB Doc 另外还参考摩天轮文章: YashanDB 23.2.9.101 企业版安装步骤抢先看! - 墨天轮 …...
安全渗透测试的全面解析与实践
引言 随着网络安全威胁的日益增加,企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试(Penetration Testing,简称渗透测试)作为主动发现和修复系统安全漏洞的重要手段,已成为安全防护体系中的关键环节。本文…...
通俗易懂的分类算法之决策树详解
通俗易懂的分类算法之决策树详解 1. 什么是决策树? 决策树是一种像树一样的结构,用来帮助我们对数据进行分类或预测。它的每个节点代表一个问题或判断条件,每个分支代表一个可能的答案,最后的叶子节点就是最终的分类结果。 举个…...
【OpenCV C++】以时间命名存图,自动检查存储目录,若不存在自动创建, 按下空格、回车、Q、S自动存图
文章目录 // 保存图像的函数 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::...
post get 给后端传参数
post 方式一 : data: params 作为请求体(Request Body)传递: 你已经展示了这种方式,通过data字段直接传递一个对象或数组。这种方式通常用于传递复杂的数据结构。dowmfrom: function (params) { return request({ u…...
数据仓库的特点
数据仓库的主要特点可以概括为:面向主题、集成性、非易失性、时变性、高性能和可扩展性、支持复杂查询和分析、分层架构以及数据质量管理。 1. 面向主题(Subject-Oriented) 数据仓库是面向主题的,而不是面向事务的。这意味着数据…...
任务9:交换机基础及配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…...
ArcGIS操作:07 绘制矢量shp面
1、点击目录 2、右侧显示目录 3、选择要存储的文件夹,新建shp 4、定义名称、要素类型、坐标系 5、点击开始编辑 6、点击创建要素 7、右侧选择图层、创建面 8、开始绘制,双击任意位置结束绘制...
【AI深度学习基础】NumPy完全指南终极篇:核心功能与工程实践(含完整代码)
NumPy系列文章 入门篇进阶篇终极篇 一、引言 在完成NumPy入门篇的基础认知与进阶篇的特性探索后,我们终于迎来这场终极技术深潜。本文不再停留于API使用层面,而是直指NumPy的架构内核与高性能工程实践的本质矛盾。作为Python科学计算领域的基石&#…...
Golang语法特性总结
1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…...
Java并发编程利器CyclicBarrier:从使用到源码深度解析,掌握多线程同步的艺术
引言 在多线程编程中,你是否遇到过这样的需求? 多线程分阶段处理数据,每个阶段完成后等待其他线程 并行计算任务需要多次同步汇总结果 模拟高并发场景下多个线程同时触发操作 CyclicBarrier(循环屏障)正是解决这类问题的神器!与CountDownLatch不同,它支持重复使用和自定…...
1.从0搭建前端Vue项目工程
我们通过vue官方提供的脚手架Vue-cli来快速生成一个Vue的项目模板。 **注意:**需要先安装NodeJS,然后才能安装Vue-cli。 环境准备好了,接下来我们需要通过Vue-cli创建一个vue项目,然后再学习一下vue项目的目录结构。Vue-cli提供了…...
3D Web轻量化引擎HOOPS Communicator的核心优势解析:高性能可视化与灵活部署!
在当今数字化时代,工业领域的工程应用不断向基于Web的方向发展,而HOOPS Web平台作为一款专为构建此类工程应用程序打造的软件开发套件集,正发挥着日益重要的作用,成为构建强大工程应用的基石。 一、HOOPS Web平台概述 HOOPS Web…...
DeepSeek集成到VScode工具,让编程更高效
DeepSeek与VScode的强强联合,为编程效率树立了新标杆。 DeepSeek,一款卓越的代码搜索引擎,以其精准的索引和高速的检索能力,助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后,开发者无需离开熟悉的编辑…...
Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转
本文是Excel-to-JSON插件的官方文档 https://excel-to-json.wtsolutions.cn 简化浓缩翻译的中文版,仅供参考。详细的还请查看官方文档。 在数据处理和交换的过程中,将Excel文件转换为JSON格式是一项常见需求。Excel-to-JSON作为一款Microsoft Excel插件…...
深度探索:美团开源DeepSeek R1 INT8量化技术的性能革命
摘要 美团搜索推荐机器学习团队近日发布了一项重要开源成果——DeepSeek R1的INT8无损满血版。该模型部署在A100硬件上,采用INT8量化技术,在保持BF16精度的同时,实现了高达50%的吞吐量提升。这一突破使得老旧显卡无需更换硬件即可获得显著性能…...
gn学习存档
以下答案均由deepseek提供,仅作学习存档。 1. 举例说明action和action_foreach区别 场景设定 假设需要处理一组文件: 输入文件:src/data/file1.txt, src/data/file2.txt, src/data/file3.txt处理逻辑:将每个 .txt 文件转换为 …...
扩展Windows磁盘的技术型教学文章
在Windows操作系统中,扩展磁盘是一项常见的任务,特别是当您需要增加存储空间以容纳更多数据时。以下是一份技术性的教学文章,介绍如何在Windows系统中扩展磁盘: #### 步骤一:打开磁盘管理器 1. 按下 Win X 组合键&a…...
【每日学点HarmonyOS Next知识】web滚动、事件回调、selectable属性、监听H5内部router、Grid嵌套时高度设置
【每日学点HarmonyOS Next知识】web滚动、事件回调、selectable属性、监听H5内部router、Grid嵌套时高度设置 1、HarmonyOS WebView加载url无法滚动? scroll 里面嵌套webView,demo参考: // xxx.ets import web_webview from ohos.web.webv…...
为什么我劝你放弃FLANN 1.9.2?聊聊源码编译那些坑与1.9.1版的真香选择
为什么FLANN 1.9.1才是开发者更明智的选择:深度解析编译陷阱与版本决策 在开源库的世界里,"最新版本"往往被默认为"最佳选择",但FLANN 1.9.2却打破了这个常规认知。作为一名经历过无数次深夜调试的开发者,我必…...
深度学习编译器优化:CNN与MHA块的性能差异与实践指南
1. 深度学习编译器优化概述在深度学习模型部署的实际场景中,我们常常面临一个关键矛盾:训练框架(如PyTorch)的动态图特性虽然灵活,但在推理时会产生显著的性能开销。这正是深度学习编译器技术大显身手的领域——通过静…...
汇编新手避坑指南:搞懂AX、BX、CX、DX这些“双面”寄存器,才算入门
汇编新手避坑指南:搞懂AX、BX、CX、DX这些“双面”寄存器,才算入门 第一次接触汇编语言时,那些神秘的寄存器名称总让人望而生畏。尤其是AX、BX、CX、DX这几个"双面人",一会儿能拆成AH和AL,一会儿又能合体使用…...
Taotoken平台Token计费模式下的用量看板使用指南
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken平台Token计费模式下的用量看板使用指南 作为项目管理者,当团队同时接入多个大语言模型进行开发时,…...
GO-Surf:基于神经特征网格的快速高保真三维表面重建技术解析
1. 项目概述:从点云到高保真表面的跨越在三维视觉与机器人领域,从一组稀疏的RGB-D图像序列中,快速、高质量地重建出物体的完整表面模型,一直是一个核心且富有挑战性的任务。传统的基于体素或点云的方法,要么在精度上难…...
负载电阻从500Ω到10kΩ:用Multisim深度解读谐振放大器选择性变化的底层逻辑
负载电阻从500Ω到10kΩ:用Multisim深度解读谐振放大器选择性变化的底层逻辑 在电子电路设计中,谐振放大器是一个经典而重要的电路结构。许多工程师和爱好者都能熟练地搭建电路并进行基础测试,但当被问及"为什么负载电阻的变化会影响放大…...
避坑指南:用3dMax一键房屋插件时,为什么你的窗洞总创建失败?
3dMax一键房屋插件窗洞创建失败的深度排查手册 引言 在建筑可视化与室内设计领域,3dMax的一键房屋插件确实为设计师节省了大量重复劳动时间。然而,许多中级用户在尝试创建窗洞时,常常遭遇各种意料之外的失败——从简单的按钮灰色不可点击&…...
串口屏三大主流方案的多维度比较
全球串口屏市场正处于稳步增长通道。据行业研究机构数据,2025年全球串口屏市场规模约6.0亿美元,预计到2030年将增长至6.9亿美元,年复合增长率约5.6%。越来越多的中小设备制造商面临同一个问题:如何在预算和开发周期内,…...
STM32F103驱动ST7567 LCD屏:手把手教你移植U8g2库(SPI接口,附完整工程)
STM32F103驱动ST7567 LCD屏:从零开始移植U8g2库实战指南 当你第一次拿到一块ST7567驱动的LCD屏时,可能会被各种引脚定义和初始化代码搞得晕头转向。本文将带你从硬件连接到软件移植,一步步完成U8g2库在STM32F103上的适配过程。不同于简单的代…...
告别JNI内存泄漏:实战中那些容易踩坑的字符串与数组操作(附完整代码示例)
告别JNI内存泄漏:实战中那些容易踩坑的字符串与数组操作(附完整代码示例) 在Android NDK开发和高性能Java服务中,JNI(Java Native Interface)作为连接Java与C的桥梁,其重要性不言而喻。然而&…...
