回顾C++知识,写给自己看的,同时希望对大家有所帮助
总述
正文
代码区
静态区(static)
栈区(stack)
堆区(heap)
常量存储的位置
函数调用过程
C++内存分为代码区、静态区、栈区、堆区共四个区域
其中静态区又分为 数据区、BSS区
存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
总结:你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读。
数据区: 数据区里主要存放的是已初始化的全局变量、静态变量和全局常量
BSS区:bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL
由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配(new, malloc())和释放(delete, free()),若程序员不释放,程序结束时由操作系统回收。
全局常量对象,存放在静态区的数据区;局部常量对象,存放在栈区;类的属性为const,存储位置跟随类对象
执行某个函数时,如果有参数,则在栈上为形式参数分配空间(即使参数为指针或引用也要分配用于存储指针的空间,引用的底层也是指针),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域(栈、堆)分配空间(若为static变量,则在程序开始运行时就已经分配了空间),函数内的语句执行完后,若函数没有返回值,则直接返回执行原点,若存在返回值,则先将返回值进行拷贝传回,再返回执行原点,函数全部执行完毕后,进行退栈操作,将刚才函数内部在栈上申请的内存空间释放掉。