值类型和引用类型

本文最后更新于:2023年12月5日 晚上

堆栈

C 代码和内存布局之间的对应关系

每个进程都包括 5 种不同的数据段:

  1. 代码段:可执行程序在内存中的镜像,只读,不可写。
  2. 数据段:存放已初始化全局变量
  3. BSS 段:Block Started by Symbol”的缩写,意为“以符号开始的块,BSS 段包含了程序中未初始化的全局变量,在内存中 bss 段全部置零。
  4. 堆:heap,存放数组和对象,堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
  5. 栈:stack,栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括 static 声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场。可以把堆栈看成一个寄存、交换临时数据的内存区

堆和栈的区别

  • 程序内存布局场景下,堆与栈表示两种内存管理方式;
  • 数据结构场景下,堆与栈表示两种常见的数据结构;

程序内存分区中的堆和栈

  • 栈 由操作系统自动分配释放,用与存放函数的参数值,局部变量等,其操作方式类似与数据结构中的栈。栈区向地址减小的方向增长。程序员无法控制,若分配失败,则提示栈移出错误。
  • 堆 由开发人员分配和释放,若开发人员不释放,程序结束时由 OS 回收,分配方式类似与链表。php 中 new 等可以申请内存,delete 等可以删除内存。

值类型

变量直接存储值,内存通常在栈中分配。

值类型:基本数据类型 intfloatboolstring 以及数组结构体

引用类型

变量存储的是一个地址,这个地址存储最终的值。内存通常在 堆上分配。通过 GC 回收。

引用类型:pointer(指针)slicemapchaninterfacefunction


值类型和引用类型
http://blog.lujinkai.cn/Golang/值类型和引用类型/
作者
像方便面一样的男子
发布于
2022年1月25日
更新于
2023年12月5日
许可协议