C++内存模型
- 前言
一个C++程序处理过程如下:源程序-->预处理器-->经过预处理的源程序-->编译器-->目标汇编程序-->汇编器-->可重定位机器代码-->链接器(此阶段也会加入相应的库文件、可重定位对象文件)-->目标机器代码。编译器对程序进行上述处理,得到一份可执行文件,可执行文件的执行与编译器本身无关。
- 五大存储区
- 栈区
个人理解如下:有个栈顶指针始终指向进程地址空间的最高地址,在编译过程,编译器就已经为该程序计算好会占用的栈空间大小,形成一些信息附加给该程序,当可执行文件执行时,遇到局部变量、函数形参、函数使用临时变量作为返回值等情况时,就为它们在该地址空间栈区分配内存,离开作用域后,即释放内存。
eg:
void paint(int a){}
当此函数被调用时,该进程就会使用之前编译器为它计算记录好的一些使用内存信息,自动在栈区为该形参 a 分配内存,当函数调用结束,栈指针移动,即释放栈中该变量所占用的内存。局部变量亦如是,执行到局部变量的定义语句时,便会为其分配内存,离开其所在作用域时,即会释放内存。
ps:
网上说的,编译器为自动变量分配内存和释放内存,其实不够正确,实际上,是编译器计算好会占用的情况,当可执行文件执行时,根据信息来分配内存和释放内存。
- 堆区
由程序员来分配与释放,存储周期为,直到程序员释放内存,若一直不释放即一直占用。如new关键字,申请的就是堆上的内存,C++中将其抽象为自由存储区。
- 静态存储区
在程序的编译阶段,编译器会为程序计算有多少个静态或全局变量,然后计算所占用的总的内存大小,并将该信息附加到最终的可执行文件中。当可执行文件一启动时,该进程就在地址空间中为它分配计算好大小的静态区内存,直到结束前的这段时间,其位置都不会发生改变。如,全局变量,静态局部变量,静态全局变量等。
疑惑:
- 常量区
存放const修饰的变量或者字面量。(唔...可能类似于静态区?这样定义是否正确?)
- 代码区
存放可执行文件,即一系列的机器指令的文件。
posted @
2020-03-02 23:18
LeeQMoon
阅读(
243)
评论()
收藏
举报