gpt4 book ai didi

go - 为什么 Go 不为结构比较指定填充内容?

转载 作者:行者123 更新时间:2023-12-01 22:38:21 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

1年前关闭。




Improve this question




来自 Dave Cheney 关于 Go 编译器生成的结构比较代码的文章 (https://dave.cheney.net/2020/05/09/ensmallening-go-binaries-by-prohibiting-comparisons):

Padding exists to ensure the correct field alignments, and while it does take up space in memory, the contents of those padding bytes are unknown. You might assume that, being Go, the padding bytes are always zero, but it turns out that’s not the case–the contents of padding bytes are simply not defined. Because they’re not defined to always be a certain value, doing a bitwise comparison may return false because the nine bytes of padding spread throughout the 24 bytes of S [a previously defined struct with padding] may not be the same.

The Go compiler solves this problem by generating what is known as an equality function. In this case S‘s equality function knows how to compare two values of type S by comparing only the fields in the function while skipping over the padding.


编辑:同一来源指出 struct {int64, int64}使用内存比较进行比较,而 struct {int64, int8}由于填充需要自定义函数,从而放大生成的二进制文件。
为什么 Go 编译器不通过定义填充字节内容来解决这个问题,所以它可以使用类似 memcmp 的内容进行比较反而?
编辑:归零或比较一个字而不是一个字节是否有任何开销(例如:在前面的 struct {int64, int8} 示例中归零和比较 16 个字节而不是 9)?

最佳答案

来自 spec :

Struct values are comparable if all their fields are comparable. Two struct values are equal if their corresponding non-blank fields are equal.



换句话说,结构相等不是简单的逐字节比较。这是一个逐个字段的比较,使用每个字段的可比性/相等性规则。

编辑:

即使填充被归零,许多结构仍然无法直接使用 memcmp 之类的东西进行比较.像字符串和接口(interface)这样的类型由于它们的底层类型表示而不是内存可比的,即使它们在逻辑上是可比的并且根据规范可以相等。要查看实际情况,请查看 https://play.golang.org/p/lmu-THnWY3W .

如果您想了解结构相等性是如何实现的,请查看 source code .

关于go - 为什么 Go 不为结构比较指定填充内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61732427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com