内容简介:根据看下面例子,就很明显了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)
}
参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript RIA开发实战
(英)Dennis Odell / 张立浩 / 清华大学出版社 / 2010 / 48.00元
本书介绍如何采用最合理的方式为RIA编写可靠的、易于维护的HTML、CSS和JavaScript代码,以及如何使用Ajax技术在后台实现浏览器与Web服务器的动态通信。本书将介绍您在构建Web应用程序时可能遇到的性能限制,以及如何以最佳的方式克服这些限制。此外,本书提供的提示可以使用户界面响应更加灵敏。 本书也将介绍如何通过添加使用自定义字体的印刷标题、多媒体回放组件、自定义窗体控件和动态绘......一起来看看 《JavaScript RIA开发实战》 这本书的介绍吧!