3 回答
TA贡献1876条经验 获得超7个赞
目前没有编译时优化;这些值在 x64 上填充为 8 个字节。
您可以手动排列结构以最佳利用空间;通常是从较大的类型变为较小的类型;例如,8 个连续的字节字段将仅使用 8 个字节,但单个字节将被填充到 8 字节对齐,请考虑: https: //play.golang.org/p/0qsgpuAHHp
package main
import (
"fmt"
"unsafe"
)
type Compact struct {
a, b uint64
c, d, e, f, g, h, i, j byte
}
// Larger memory footprint than "Compact" - but less fields!
type Inefficient struct {
a uint64
b byte
c uint64
d byte
}
func main() {
newCompact := new(Compact)
fmt.Println(unsafe.Sizeof(*newCompact))
newInefficient := new(Inefficient)
fmt.Println(unsafe.Sizeof(*newInefficient))
}
如果您考虑到这一点;您可以优化结构的内存占用。
TA贡献1864条经验 获得超6个赞
或者我根本不应该担心这个?
是的你应该。
这也称为机械同情(请参阅此Go Time 播客片段),因此它还取决于您正在编译的硬件架构。
如图所示:
“天字节对齐回来咬我”(2014 年 1 月)
《关于 Go 切片值的内存对齐》(2016 年 7 月)
Go 切片中的值是 16 字节对齐的。它们不是 32 字节对齐的。
Go 指针是字节对齐的。
TA贡献1872条经验 获得超3个赞
这取决于您正在开发的应用程序的类型以及这些结构的使用。如果应用程序需要满足一些内存/性能标准,您绝对应该关心内存对齐和填充,但不仅如此 - 有一篇很好的文章https://www.usenix.org/legacy/publications/library/proceedings/als00/2000papers/论文/full_papers/sears/sears_html/index.html突出了最佳 CPU 缓存使用的主题以及结构布局和性能之间的相关性。它突出了缓存行对齐、错误共享等。
还有一个不错的 golang 工具https://github.com/1pkg/gopium可以帮助自动化这些优化,看看吧!
- 3 回答
- 0 关注
- 182 浏览
添加回答
举报