生活中只有一种英雄主义,那就是在认清生活真相之后依然热爱生活。——罗曼罗兰
他山之石,可以攻玉。范磊老师的话:“写程序就是与数据打交道,当执行程序的某一功能时,该功能所需要的数据加载到内存中,然后在执行完毕的时候释放掉该内存。”
(以下绝大部分都摘自范磊老师的《从新手到高手C++全方位学习》一书,范老师这本书写的确实相当的好!)
这就要求我们必须了解数据在内存中存放的形式:
(1)栈区(stack):由编译器自动分配并释放,该区域一般存放函数的参数值,局部变量的值等。
(2)堆区(heap):一般由程序员分配释放;若程序员不释放,程序结束时可能由操作系统回收。
(3)寄存器区:用来保存栈顶指针和指令指针
(4)全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块儿区域,未初始化全局变量和静态变量在另一块儿区域。程序结束后由系统释放。
(5)文字常量区:常量字符串就是放在这里的,程序结束后,由系统释放。
(6)程序代码区:存放函数体的二进制代码。
附注:全局作用域:定义在所有函数外部的名字具有全局作用域。(2)???静态变量的含义
引子:局部变量,在函数运行结束并返回之后,就被系统自动清除掉了,释放掉它们所占用的内存空间。全局变量可以解决这个问题,但全局变量在程序运行期间永远不会被释放,且全局变量被所有类成员和函数所共享,它的值很容易被修改。使用堆却可以很好地解决这两个问题。
堆与栈的区别:
1.内存申请方式上不同:
(1)栈,由系统自动分配,如在函数中申请一个局部变量int x ;那么系统会自动在栈中为变量x开辟内存空间。
(2)堆,需要程序员自己申请,且需要指明变量的大小。
2.系统响应的不同:
(1)栈:有求必应。不足溢出。(overflow)
(2)堆:
(太高深啦)
3.空间大小的不同
(1)栈,连续的内存区域。编译时就确定的常数。超出栈的空间会提示overflow
(2)堆,由链表串联起来的不连续的内存区域。
4.执行效率不同
(1)栈,系统自动分配,执行速度快,但是程序员不能对其操作。
(2)堆,堆是由程序员自己分配的内存,速度一般比较慢,且同2所说,容易产生内存碎片。
5.执行函数不同。
(1)栈。栈,先入后出的原则。栈向着内存地址减小的方向增长。
下面的图出自范磊老师的《从新手到高手C++全方位学习》一书,非常形象地展示了进栈和出栈。并且能够说明栈向着内存地址减小的方向增长!
(2)堆。
由链表串联起来的一大堆不连续的内存区域。
回到引子中提到的问题。为什么说堆可以解决局部变量和全局变量遇到的问题。(???创建一个对象,能够被多个函数访问,但是又不想使其成为全局的,这个时候创建一个堆对象无疑使较好的选择)
堆、栈、指针的结合利用!
存储一些较大数据的时候,将数据放到堆中,将该数据的指针放到栈中。这样可以提高程序的执行速度,避免产生不必要的碎片。
(以上几乎所有部分均摘自范磊老师的《从新手到高手C++全方位学习》一书,范老师这本书写的确实相当的好!)