C++程序在内存中分布在五个区域:
(1)栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配和释放.栈属于计算机系统的数据结构,进栈出栈有相应的计算机指令支持,而且分配专门的寄存器存储栈的地址,效率很高,内存空间是连续的,但栈的内存空间有限。
(2)堆(Heap):需要程序员手动分配和释放(malloc,free),属于动态分配方式。内存空间几乎没有限制,内存空间不连续,因此会产生内存碎片。操作系统有一个记录空间内存的链表,当收到内存申请时遍历链表,找到第一个空间大于申请空间的堆节点,将该节点分配给程序,并将该节点从链表中删除。一般,系统会在该内存空间的首地址处记录本次分配的内存大小,用于free释放该内存空间。
(3)全局/静态存储区:全局变量,静态变量分配到该区,到程序结束时自动释放,包括DATA段(全局初始化段)与BBS段(全局未初始化段)。其中,初始化的全局变量和静态变量存放在DATA段,未初始化的全局变量和静态变量存放在BBS段。BBS段特点:在程序执行前BBS段自动清零,所以未初始化的全局变量和静态变量在程序执行前已经成为0.
(4)文字常量区:存放常量,而且不允许修改。程序结束后由系统释放。
(5)程序代码区:存放程序的二进制代码
【补】什么是全局变量?什么是静态变量?
程序中变量的使用范围——作用域(Scope),就是变量的有效范围。变量的作用域取决于变量的访问性。
1. 局部变量:函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
(1)主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。
(2)允许在不同的函数中使用相同的变量名,他们代表不同变量,分配不同的存放单元,互不相干,不会发生混淆。
(3)复合语句中定义的变量,只限于使用当前函数中,也是复合语句的局部变量,复合语句:就是用{}包含起来的语句块。
(4)形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。
2.全局变量:在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括.c 和 .h 文件。它的作用域是从声明时刻开始,到程序结束。
(1)全局变量定义必须在所有函数之外。
(2)全局变量可加强函数模块之间的数据联系,但是函数又依赖这些变量,降低函数的独立性。
(3)在同一源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用。
网友评论