Go语言中显示4字节大小的布尔值[duplicate]

flseospp  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(135)

此问题在此处已有答案

Sizeof struct in Go(6个答案)
Struct has different size if the field order is different(1个答案)
Why is the struct memory size inconsistent with my expectations?(2个答案)
上个月关门了。
bool类型的strict属性显示2种不同的大小。代码段及其输出如下所示。

案例1:

package main

import (
    "fmt"
    "unsafe"
)

type Encoding struct {
    encode    [64]byte
    decodeMap [256]byte
    padChar   rune
    strict bool
}

func main() {
    e := Encoding{}

    fmt.Printf("%d", unsafe.Sizeof(e))
}

产量:328台
预期:输出应为325(64 + 256 + 4 + 1)字节

案例2:

package main

import (
    "fmt"
    "unsafe"
)

type Encoding struct {
    // encode    [64]byte
    // decodeMap [256]byte
    // padChar   rune
    strict bool
}

func main() {
    e := Encoding{}

    fmt.Printf("%d", unsafe.Sizeof(e))
}

输出:1个

gfttwv5a

gfttwv5a1#

type Encoding struct {
    encode    [64]byte
    decodeMap [256]byte
    padChar   rune
    strict    bool
}

Sizeof(bool)为1。您的计算不正确。
结构体的大小是其组成字段的大小,通过字段对齐的填充进行调整。结构体将与其最严格的字段对齐方式对齐:rune(int32)或4个字节。因此,我们有:

64 + 256 + 4 + 1 = 325

然后,使用数组元素对齐的填充调整结构的大小,以保持不变

Sizeof(array) = len(array) * Sizeof(struct)

因此,对于4字节结构体对齐,向上舍入到最接近的4,我们有:
第一个
https://go.dev/play/p/CZT-5v41SfL

328
656 == 2 * 328

byte 1
rune 4
bool 1

相关问题