返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

2.3.2 大对象

发布于 2024-10-12 19:15:56 字数 1065 浏览 0 评论 0 收藏 0

直接从堆提取大小合适的内存块。

// 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 {

    c := getMCache(mp)
  
    if size <= maxSmallSize {
        // tiny & small ...
    } else {
        span = c.allocLarge(size, noscan)
    
        span.freeindex = 1
        span.allocCount = 1
        size = span.elemsize
      
        x = unsafe.Pointer(span.base())
    }

    return x
}
// mcache.go

// allocLarge allocates a span for a large object.
func (c *mcache) allocLarge(size uintptr, noscan bool) *mspan {
    
    // 计算页数和等级。
	npages := size >> _PageShift
	spc := makeSpanClass(0, noscan)
    
    // 从堆直接分配。
	s := mheap_.alloc(npages, spc)

	// Put the large span in the mcentral swept list so that it's
	// visible to the background sweeper.
	mheap_.central[spc].mcentral.fullSwept(mheap_.sweepgen).push(s)
    
	return s
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文