五大分区
一、内存
在计算机中,内存又称主存储器,是CPU能直接寻址的存储空间。
二、分区-栈区、堆区、(全局)静态区、常量区、代码区
1.栈区(stack)
栈区用来存储局部变量、函数的形参、返回值
由编译器自动分配释放,空间比较有限。由操作系统自动管理,不用手动管理。
栈区按照先进后出的原则
栈区具有自动清除的特性,超出变量作用域后会被回收。
栈区的内容只在函数范围内存在,运行结束会被自动销毁
栈区按照内存地址由高到低方向生长,最大内存地址大小由编译时决定
2.堆区(heap)
堆区作为程序运行时分配malloc和new申请的区域
由程序员分配和释放内存,在程序运行期间均有效。堆区的变量需要手动释放否则会造成内存泄漏,不释放会在程序结束后被回收。
堆区按内存地址由低到高方向生长
3.(全局)静态区
(全局)静态区应用于存放全局变量和静态变量以及常量在整个程序的生命周期都存在的,在程序结束后由操作系统释放
全局区有 .bss段 和 .data段组成,可读可写。
未初始化或初始化为0的全局变量和静态变量存放在.bass段,.bass段不占用可执行文件空间,其内容由操作系统初始化
初始化的全局变量和静态变量存放在.data段,.data段占用可执行文件空间,其内容由程序初始化
注:所有的字符窜常量都被放在静态内存区
因为字符串常量很少需要修改,放在静态内存区会提高效率
4.常量区(.rodata)
常量区的内存是只读的,程序结束后由系统释放
5.代码区(.text)
存放程序的代码,即存放程序的二进制代码,内存由系统管理。只读不可写
参考网站:(8条消息) C语言:内存分配---栈区、堆区、全局区、常量区和代码区_c语言内存分配图_根号五的博客-CSDN博客详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段)【建议收藏】 - 知乎 (zhihu.com)C++ 内存五大分区 - 简书 (jianshu.com)