0

0

Golang优化结构体内存布局示例

P粉602998670

P粉602998670

发布时间:2025-09-29 17:28:02

|

930人浏览过

|

来源于php中文网

原创

结构体字段顺序影响内存对齐与占用,合理排列可减少填充浪费。type User中bool、int64、int32、byte因对齐需24字节;调整为int64、int32、bool、byte后仅需16字节,节省三分之一空间。

golang优化结构体内存布局示例

在Go语言中,结构体的内存布局直接影响程序的性能和内存占用。合理调整字段顺序,可以减少内存对齐带来的浪费,从而优化整体开销。

内存对齐基础

Go中的结构体字段按声明顺序存储,每个字段会根据其类型进行对齐。例如:

  • bool、int8、uint8 占1字节,对齐边界为1
  • int16、uint16 占2字节,对齐边界为2
  • int32、uint32、float32 占4字节,对齐边界为4
  • int64、uint64、float64、指针、string 占8字节,对齐边界为8

系统会在字段之间插入填充(padding),以确保每个字段位于正确对齐的位置。

未优化示例与问题

假设有一个用户信息结构体:
type User struct {
    a bool      // 1字节
    b int64     // 8字节
    c int32     // 4字节
    d byte      // 1字节
}

看起来总大小是 1+8+4+1 = 14 字节?但实际不是。内存布局如下:

立即学习go语言免费学习笔记(深入)”;

  • a: 占1字节,后面需补7字节,才能让b对齐到8字节边界
  • b: 占8字节
  • c: 占4字节
  • d: 占1字节,后面补3字节以满足结构体整体对齐(最大字段为8字节)

最终大小为 1+7+8+4+1+3 = 24字节,其中浪费了10字节。

优化后的字段排列

将字段按大小从大到小排序,可显著减少填充:

诚石C2C交易系统
诚石C2C交易系统

1. 页面全部经过SEO(搜索引擎优化)处理 2. 支持IE、FireFox等主流浏览器,在IE 和FireFox下显示相同的效果 3. 符合W3C国际网页标准,页面全部采用DIV+CSS布局 4. 采用SQL server数据库,所有数据库操作采用存储过程 5. 部分功能采用AJAX技术,良好的用户体验。 6. 后台集成在线HTML编辑软件FCKEditor,自定义美观的内容

下载
type UserOptimized struct {
    b int64     // 8字节
    c int32     // 4字节
    a bool      // 1字节
    d byte      // 1字节
    // 中间可能有2字节填充,但仅需补2字节使整体对齐到8的倍数
}

布局分析:

  • b: 8字节,自然对齐
  • c: 4字节,紧接其后,无需额外填充
  • a 和 d:共2字节,放在4字节剩余空间中
  • 最后补2字节,使总大小为16(8的倍数)

总大小为 16字节,比原来的24节省了三分之一。

实用建议

优化结构体内存布局时,记住以下几点:

  • 把占用8字节的字段(如int64、float64、指针)放前面
  • 接着是4字节字段(int32、rune等)
  • 然后是2字节(int16)
  • 最后是1字节(bool、byte)
  • 相同类型的字段尽量连续声明

使用 unsafe.Sizeof 可验证优化效果:

fmt.Println(unsafe.Sizeof(User{}))        // 输出 24
fmt.Println(unsafe.Sizeof(UserOptimized{})) // 输出 16

基本上就这些。不复杂但容易忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

343

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

396

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

240

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

194

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

458

2025.06.17

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号