Golang中多大的对象算是大对象,多小的对象算是小对象?

大家好,我有个疑问。好多文章都会提到golang中小对象用值传递,大对象用引用传值。但是多大的对象算是小对象呢?比如一个struct里有多少个字段就是大对象了,有没有一个明确的界限呢?

已邀请:

h12 - https://h12.io/about

赞同来自: astaxie heramerom sean momaek ioco

参考两个Go标准库里的例子:

time.Time 24 bytes,用值
http.Request 144 bytes, 用指针

sinnera

赞同来自: yuchen16

从内存分配的角度看,>32K的是大对象

yuchen16

赞同来自: heramerom

看go的源码有这样的注释

src/runtime/malloc.go

// Allocate an object of size bytes.
// Small objects are allocated from the per-P cache's free lists.
// Large objects (> 32 kB) are allocated straight from the heap.
func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
    ...
}

也就是说go在分配内存的时候如果是small objects就直接在per-P上分配,large objects是在heap上分配,至于per-P是什么,可以在另外的源码看到

src/runtime/mcache.go

// Per-thread (in Go, per-P) cache for small objects.
// No locking needed because it is per-thread (per-P).

也就是为单个goroutine分配的线程空间,不存在并发,所以使用的时候不用加锁,小对象分配在这上面运行效率会很高

Mrwxj - 图样图森破

赞同来自:

我理解的是基本数据类型和非基本数据类型,看需要的

lrita

赞同来自:

看场景

  • 内存分配 16byte < 1024byte < 32kbyte 3档
  • 函数传递 有时传递指针会造成对象逃逸,内存拷贝和内存分配 自己考量
  • 多线程共享 建议对象大小跟cache line大小对其,并且控制在1-2个cache line大小上。

要回复问题请先登录注册