美文网首页
go 的空结构体为什么 size == 0?

go 的空结构体为什么 size == 0?

作者: wayyyy | 来源:发表于2022-08-28 01:04 被阅读0次
type EmptyStruct struct{}

func main() {
    a := struct{}{}
    b := struct{}{}
    c := EmptyStruct{}

    fmt.Printf("%p\n", &a)
    fmt.Printf("%p\n", &b)
    fmt.Printf("%p\n", &c)

    fmt.Println(unsafe.Sizeof(a))
}
image.png

从上面可以看出,空结构体的变量的内存地址都是一样的,这是因为:
编译器在编译期间,识别到 size == 0 这种特殊类型的内存分配,会统统分配出 runtime.zerobase 的地址出去,这个代码逻辑是在 mallocgc 函数里面:

func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
    if gcphase == _GCmarktermination {
        throw("mallocgc called with gcphase == _GCmarktermination")
    }

    if size == 0 {
        return unsafe.Pointer(&zerobase)
    }
    ...
}
空结构体对齐规则

TODO

相关文章

  • go 的空结构体为什么 size == 0?

    从上面可以看出,空结构体的变量的内存地址都是一样的,这是因为:编译器在编译期间,识别到 size == 0 这种特...

  • protoc-生成go指针

    protoc-生成go指针 这里指的是为结构体中基础类型生成go指针,嵌套结构体默认就是指针 为什么需要生成指针?...

  • go 空结构体 struct{}的应用

    go空结构体的广泛应用得益于go空结构体不占用任何内存一个类型的宽度是该类型的实例所占有的存储空间的字节数 一个类...

  • 1-链表基础知识

    双向链表 初始化空的链表 其中 &((type )0)->member) 是指在结构体type结构体中的membe...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • go结构体(struct)和方法(method)

    结构体(struct) go中没有对象这一概念,所以采用了结构体的概念,结构体在go中有着非常重要的位置。结构体是...

  • Go 语言空结构体详解

    你必须非常努力,才能看起来毫不费力!微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Her...

  • 《Go语言四十二章经》第十八章 Struct 结构体

    《Go语言四十二章经》第十八章 Struct 结构体 作者:李骁 18.1结构体(struct) Go 通过结构体...

  • 第03天(复合类型)_结构体的基本使用

    29_结构体普通变量初始化 30_结构体指针变量初始化.go 31_结构体成员的使用:普通变量.go 32_结构体...

  • Go Struct

    Go语言通过自定义结构的方式来实现新的类型,结构体是类型中带有成员的复合类型。 Go语言使用结构体和结构体成员来描...

网友评论

      本文标题:go 的空结构体为什么 size == 0?

      本文链接:https://www.haomeiwen.com/subject/eteqnrtx.html