C++ 内存四分区模型
内存分区
首先,为什么要将内存进行分区?意义是什么:
给不同区域存放的数据,赋予不同的声明周期,提高编程灵活性和内存利用率。
下面总结一下四个分区的特性
【程序运行前:程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域】
在程序编译后,生成了可执行程序,未执行该程序前分为两个区域(都在低地址区)
代码区及其特点:
- 存放CPU执行的机器指令
- 不可寻址
- 代码区是共享的,共享的目的是对于频繁执行的程序,只需要在内存中有一份即可
- 代码区是只读的,使其只读的原因是防止程序意外修改了它的指令
全局区(静态存储区)及其特点:
-
静态存储区内的变量在程序编译阶段就已经分配好了内存空间并初始化。这块内存在程序的整个运行期间都存在,他主要是存放静态变量、全局变量和常量。
-
静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。静态存储区的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过通过指针或引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。
-
变量:
- 全局变量:存放于全局区
- 局部变量:存放于栈区
- 全局变量:存放于全局区
-
静态变量:都存放于全局区
-
常量:
- 字符串常量:存放于全局区
- const 修饰的变量:
- 全局常量:存放于全局区
- 局部常量:存放于栈区
栈区(程序运行后):
- notice:不要返回局部变量的地址
- 栈区由编译器管理开辟和释放
- 存放函数的参数值,局部变量等
- 整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可以用过VS手动更改栈的大小。64bits的linux默认栈大小为10M
堆区(程序运行后):
- 由程序员分配(new)和释放(delete),若程序员未释放,则代码结束时由操作系统回收
- 生命周期是整个程序运行期间,使用malloc或者new进行申请,堆的总大小位机器的虚拟内存大小。
- 说明:new操作符本质上是使用了malloc进行内存的申请,new和malloc的区别如下:
- malloc 是c语言中的函数,而new是c++中的操作符
- malloc 申请之后返回的类型是void *,而new返回的指针带有类型。
- malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。
- new出来的对象存放在堆区,返回的 指向他的指针则存放于栈区(方便快速找到他在堆区中的位置)。
- new出来的对象,即使是局部变量,也是不会自动释放的。由管理员释放。
参考