首页 后端开发 Golang Golang 字段排序很重要吗?

Golang 字段排序很重要吗?

Sep 07, 2024 pm 08:30 PM

你好,地鼠们!在使用 Golang 的第一年里,我一直在想字段必须有顺序,我想我为什么要为此烦恼呢?好吧,这只是字段,可能只是出了什么问题,我对吗?和大多数其他新手一样,我认为这不值得费心。换句话说,结构体中的某些字段按特定顺序放置有多重要?嗯,非常划算!

字段排序是一开始被忽略的方面之一,但随着教程的进行,这种理解,特别是 Go 如何使用指针,被认为是非常关键的。实际上,在提高应用程序性能时,尤其是在处理大型数据集或占用内存过多的操作时,正是这个顺序至关重要。这个不幸的缺陷将通过更好地理解为什么它对于 Go 字段排序如此重要而得到弥补。

Go如何在内存中存储结构体?

当放置在内存中时,结构体被表示为一块连续的内存块,其中所有字段根据其在结构体中的定义依次定位。这可能看起来相当简单,但这种线性组织也发挥了一些相当重要的作用,特别是在内存对齐和填充等领域。

内存对齐和填充

内存对齐是关于如何从内存中放置和访问数据的。通常,CPUS 在内存中获取数据的位置方面可能存在偏差,这称为对齐边界。例如,应从第 4 个字节地址放置或取出 32 位整数。如果结构体中存在未正确对齐的字段,则翻阅页面时,Go 编译器可能会添加填充字节等。这变得相当浪费。例如,看看这个结构。

struct example{

a bool   // 1 byte

b int32 // 4bytes;

c bool   // 1byte 

d int64 //8 bytes
}
登录后复制

Golang Field ordering matters?

由于对齐规则,在这个不正确的结构中,Go 编译器可能会在这些字段的中间添加一个或多个填充字节:

  • a 是 1 个字节,但 b 想要 4 个字节 对齐,因此填充插入 3 个字节

  • b 长度为 4 字节

  • c 长度为 1 个字节,但为了对齐需要 8 个字节的 d,需要 7asing,因此引入了填充。

  • d 长度为 8 字节

木材如何成为结构木材,由于腿的原因,尺寸仍然是24,尽管内容只需要14,但是看看实际内容加上填充物的体积.

重新排序字段以实现最小填充

字段顺序和结构查找有助于避免以负边距形式浪费空间。换句话说:

type Example struct { 

d int64 // 8 bytes

b int32 // 4 bytes

a bool // 1 byte

c bool // 1 byte

}
登录后复制

Golang Field ordering matters?

在上面的优化结构中:

  • d 占用 8 个字节.

  • b 占用 4 个字节.

  • a 和 c 各占用 1 个字节,无需填充。

此结构现在只有 16 字节 大小,这比以前的 24 字节 大小的结构更好。

为什么这很重要

当考虑常见的小型应用程序时,他或她很可能会发现应用程序使用的内存量与后者没有什么不同。然而,在性能甚至内存空间都至关重要的结构中,情况并非如此,考虑到嵌入式系统、超快速高频交易应用程序或旨在处理大量数据的应用程序,这些忠实的限制可以快速增加。当使用许多大型数组或连接的结构切片来构造或操作时,这一点变得更加明显。当结构的容量仅高出几个字节时,就不太容易注意到偏差或负载联合。当低内存架构被批量生产,需要处理数百万个实例时,这种令人上瘾的过度浪费不再是闻所未闻的。

结论

排序字段不仅从 Golang 结构设计的角度来看很好,而且在内存优化中也发挥着重要作用。了解 Go 如何为结构及其像素进行内存布局的这一方面可以在实践中实现更有效的结构设计。当涉及大量使用内存的应用程序时,这种微不足道的调整可能会带来相当大的性能提升。当您下次有机会在 Go 中定义结构体时,不要只是将这些字段溢出。相反,花一分钟考虑一下顺序 - 在未来的日子里你会感谢你自己和你的申请!

以上是Golang 字段排序很重要吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

开始GO:初学者指南 开始GO:初学者指南 Apr 26, 2025 am 12:21 AM

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang vs.C:性能和速度比较 Golang vs.C:性能和速度比较 Apr 21, 2025 am 12:13 AM

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

Golang vs. Python:主要差异和相似之处 Golang vs. Python:主要差异和相似之处 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C:性能的权衡 Golang和C:性能的权衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

表演竞赛:Golang vs.C 表演竞赛:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

Golang vs. Python:利弊 Golang vs. Python:利弊 Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

See all articles