各自努力,最高处见!加油!
go中的堆栈与C++中的堆栈
一、C++中的堆栈
C/C++中的堆栈是操作系统级别的概念,它通过编译器所在的环境来决定。
- 栈:指的是程序运行时自动获得的一小块内存,函数调用消耗的栈的大小,会在编译期间由编译器决定。这块内存用于保存局部变量或者保存函数调用栈。(1MB)
- 堆:每当程序通过系统调用向操作系统申请内存时,会将所需的空间从维护的堆内存地址空间中分配出去,而在归还是将归还的内存合并到所维护的地址空间中。(1GB)
二、go程序中的堆栈
go语言中的堆栈与C++中的有较大区别。C++(传统意义上的)的堆栈被全部用于GO的运行时,用于维护运行时各个组件的协调。调度器、垃圾回收、系统调用等。
所以go语言中的堆栈都指的是go运行时向操作系统申请的《堆内存(上文C++中表述的堆内存)》。所以从理论上来说,go程序可以拥有1GB的大内存。
为什么指针不能算术运算?
go程序为了防止内存碎片化,会适当对整个栈进行深拷贝,将其整个复制到另一块内存。所以在运行过程中无法确定运算前后指针所指向的地址内容是否被运行时移动。