• golang的内存模型与new()与make()


    要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型:

    |低地址|text|data|bss|heap-->|unused|<--stack|env|高地址|

    其中:

    (1)text存储程序主体,即机器指令.

    (2)data,bss存储全局变量, data存储初始化的全局变量. bss存储未初始化的全局变量. bss全称Block start by symbol, 以符号开始的块.

    (3)heap: 动态内存堆

    (4)stack: 函数调用栈.

    (5)env: 程序执行环境变量.

    ------------------------------------------------

    value types: variable point direct to value, 即变量在函数调用栈中的内容就是value.

    reference types: variable point to reference toward heap, 即变量在函数调用栈中的内容是reference, 指向heap中的某块内存.

    赋值操作=或:=, 都是将某个variable在函数调用中栈中的内容复制给目标变量. 对于value types是复制值. 对于reference types是复制引用.

    new()操作: 在函数调用栈中分配内存, 内容是目标类型的零值, 返回值是目标类型的指针.

    make()操作: 先在动态内存堆分配内存, 内容也是目标类型的零值, 再在函数调用栈中分配内存, 内容是分配的堆地址, 返回值是目标类型的值.

    注意: 一般来说,

    new()用于value types

    make()用于reference types.

    但是, new()也可用于refrences types, 只是返回值是nil的指针. make()不可用于value types, 编译会出错: make(xxx) cannot  make type xxx

    对于非elementary(primitive) type,即非基本类型, new()等价于&Type{}, 但对于基本类型, 不支持&P{}语法, 就必须使用new()来创建指针. 

    对于初始化空值, make(Type)行人于Type{}, 但要初始化多值, 就必须使用make(Type, m)

    以上原则更多体现在长变量声明long variable declaration, 与短变量声明short variable declaration. 对于后者, 更常使用new()与make()初始化.

    ---------------------------------------

    由于reference types的特点, 容易造成某些陷阱, 例如: 多个reference指向heap中的大内存,导致不能及时释放造成内存泄露危险.

  • 相关阅读:
    php底层HashTable的实现
    【问底】徐汉彬:PHP7和HHVM的性能之争
    linux查找系统中占用磁盘空间最大的文件
    深入理解Yii2.0(yii学习的经典博客)
    梦想天空(关注前端开发技术 html5+css3)
    风雪之隅(Laruence PHP开发组成员, Zend兼职顾问, Yaf, Yar, Yac, Opcache等项目作者、维护者.)
    阿里云收集服务器性能指标的python脚本
    简单5步,释放Mac磁盘空间
    我是如何自学Android,资料分享(2015 版)
    查询tensorflow中的函数用法
  • 原文地址:https://www.cnblogs.com/zolo/p/5849114.html
Copyright © 2020-2023  润新知