教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang学习笔记 内存分配 GO.1.51

Golang学习笔记 内存分配 GO.1.51

发布时间:2022-12-12   编辑:jiaochengji.com
教程集为您提供Golang学习笔记 内存分配 GO.1.51等资源,欢迎您收藏本站,我们将为您提供最新的Golang学习笔记 内存分配 GO.1.51资源

不太懂的API

persistentalloc
sysAlloc

mfixalloc.go

// 固定大小的对象分配器。 返回的内存未归零。
//
// See malloc.go for overview.
package runtime
import "unsafe"
//FixAlloc是用于固定大小对象的简单自由列表分配器。
//Malloc使用包裹在sysAlloc周围的FixAlloc来管理其MCache和MSpan对象。
//FixAlloc_Alloc返回的内存未归零。
//调用方负责锁定FixAlloc调用。
//调用者可以将状态保留在对象中,但通过释放和重新分配可以粉碎第一个单词。
type fixalloc struct {
   size uintptr
   first unsafe.Pointer // go func(unsafe.pointer, unsafe.pointer); f(arg, p) called first time p is returned, 对内存进行初始化
   arg unsafe.Pointer
   list *mlink // 缓存释放数据
   chunk *byte // 每次申请64K数据
   nchunk uint32 // trunk剩余数据大小
   inuse uintptr // 使用中的数据
   stat *uint64
}
type mlink struct {
   next *mlink
}
func fixAlloc_Init(f *fixalloc, size uintptr, first func(unsafe.Pointer, unsafe.Pointer), arg unsafe.Pointer, stat *uint64) {
   f.size = size
   f.first = *(*unsafe.Pointer)(unsafe.Pointer(&first))
   f.arg = arg
   f.list = nil
   f.chunk = nil
   f.nchunk = 0
   f.inuse = 0
   f.stat = stat
}
func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer {
   if f.size == 0 {
      print("runtime: use of FixAlloc_Alloc before FixAlloc_Initn")
      throw("runtime: internal error")
   }
   if f.list != nil {
      v := unsafe.Pointer(f.list)
      f.list = f.list.next
     f.inuse  = f.size
     return v
   }
   if uintptr(f.nchunk) < f.size {
      f.chunk = (*uint8)(persistentalloc(_FixAllocChunk, 0, f.stat))
      f.nchunk = _FixAllocChunk
   }
   v := (unsafe.Pointer)(f.chunk)
   if f.first != nil {
      fn := *(*func(unsafe.Pointer, unsafe.Pointer))(unsafe.Pointer(&f.first))
      fn(f.arg, v)
   }
   f.chunk = (*byte)(add(unsafe.Pointer(f.chunk), f.size))
   f.nchunk -= uint32(f.size)
   f.inuse  = f.size
   return v
}
func fixAlloc_Free(f *fixalloc, p unsafe.Pointer) {
   f.inuse -= f.size
   v := (*mlink)(p)
   v.next = f.list
   f.list = v
}
到此这篇关于“Golang学习笔记 内存分配 GO.1.51”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
Golang笔记:语法,并发思想,web开发,Go微服务相关
Golang学习笔记(五):Go语言与C语言的区别
Go语言内存分配机制
Go 语言数据类型:byte、rune与字符串
Go 学习笔记 07 | 指针详解
Sublime Text 3配置Go语言开发环境
Go 开发关键技术指南 | 为什么你要选择 Go?(内含超全知识大图)
Go: 学习笔记1 让编程更有乐趣
go语言学习笔记(第3章)—面向对象编程

[关闭]
~ ~