内容简介:根据看下面例子,就很明显了make在初始化不同类型对象时,会调用不同的函数.
概述
根据 官方文档 描述
make是用来分配并且初始化slice,map,chan等类型的对象 new也是用来分配内存的,返回对应内向的0值的指针,但并不初始化对象
看下面例子,就很明显了
a := new([]int) b := make([]int,1) fmt.Println(a) fmt.Println(b) fmt.Println(unsafe.Sizeof(*a)) fmt.Println(unsafe.Sizeof(b)+unsafe.Sizeof([1]int{})) output: &[] [0] 24 32
make
make在初始化不同类型对象时,会调用不同的函数.
make slice时会调用 runtime.makeslice
make map时会调用 runtime.makemap或者runtime.makemap_small
make chan 时会调用 runtime.makechan
b := make([]int,1) fmt.Println(b)
以slice为例,转成汇编后能看见如下代码
PCDATA $0, $0 CALL runtime.makeslice(SB) 这里 MOVQ 32(SP), AX MOVQ 24(SP), CX MOVQ 40(SP), DX
PCDATA $0, $0 CALL runtime.makemap_small(SB) MOVQ (SP), AX
new
以下面代码为例
a := new([]int) fmt.Println(a)
转成汇编语言后能看下如下代码:
PCDATA $0, $0 CALL runtime.newobject(SB) MOVQ 8(SP), AX XORPS X0, X0
可以看到最终会调用 runtime.newobject 来分配内存,并且返回指针
func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) }
参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C Primer Plus
Stephen Prata、云巅工作室 / 云巅工作室 / 人民邮电出版社 / 2005-2-1 / 60.00元
《C Primer Plus(第5版)(中文版)》共17章。第1、2章学习C语言编程所需的预备知识。第3到15章介绍了C语言的相关知识,包括数据类型、格式化输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等,知识内容都针对C99标准;另外,第10章强化了对指针的讨论,第12章引入了动态内存分配的概念,这些内容更加适合读者的需求。第16章和第17章讨论了C预处......一起来看看 《C Primer Plus》 这本书的介绍吧!