C++内存模型
- 五大存储区
- 栈区
由编译器在运行时自动为其分配与释放内存,如局部变量、函数形参、函数使用临时变量作为返回值等。
eg:
void paint(int a){}
当此函数被调用时,编译器自动在栈区为该形参 a 分配内存,当函数调用结束,编译器即会释放栈中该变量所占用的内存。局部变量亦如是,执行到局部变量的定义语句时,编译器便会为其分配内存,离开其所在作用域时,即会释放内存。
ps:
(个人以为,C++中是没有栈区这个概念的,实际上是抽象为自动变量此概念。为了方便解析,以下均使用栈区作为说明。)
疑问:
- 栈上变量之间分配的内存是连续的吗
- 堆区
由程序员来分配与释放,存储周期为,直到程序员释放内存,若一直不释放即一直占用。如new关键字,申请的就是堆上的内存,C++中将其抽象为自由存储区。
疑惑:
i. 堆区中各自申请的内存是连续紧挨着的吗?还是说,直接在堆区中循环寻找,直到找到一块大于或等于所申请的内存大小的区域,即会存在内存碎片?
- 静态存储区
在程序启动时,编译器就已经为其分配好内存,直到结束前的这段时间,其位置都不会发生改变。如,全局变量,静态局部变量,静态全局变量等。
疑惑:
i. 到底是不是编译器为其分配的内存,还是操作系统直接就为它分配的。
- 常量区
存放const修饰的变量或者字面量。(唔...这样定义是否正确?)
- 代码区
存放可执行文件,即一系列的机器指令的文件。
C++之内存分配
原文:https://www.cnblogs.com/LeeQMoon/p/12398896.html