【C++内存管理】一)过程:预处理(cpp
->.i文件<进行预编译之后生成的文件>)——编译(.i文件->.s文件<汇编语言文件>)——汇编(.s文件->.o文件<目标文件>)——链接 二)详细内容:
1.预处理:处理以#开头的文件
2.编译:进行词法分析、语法分析、语义分析及优化后生成汇编代码文件
3.汇编:将汇编语言转换成机器语言
4.链接:将各个目标文件组装起来
三)链接方式:
1.静态链接:.a/.lib
1)静态链接含义:将调用的库打包装进可执行文件,运行时不需要再调用库。但是链接时可能同一个库链接了好几次,浪费空间。
2)静态链接优缺点:
优点:速度快
缺点:浪费空间,更新困难
2.动态链接:.so/.dll
- 动态链接含义:程序运行时,动态库内容会被放入相应的地址空间,然后可执行文件进行调用
- 动态链接优缺点:优点:节省空间,容易更新 缺点:浪费时间
【堆和栈的区别】五个区:
- 栈:编译器自动释放,存放局部变量,类似数据结构中的栈
- 堆:程序员手动释放,若程序员不释放,程序结束时可能由 *** 作系统释放,和数据结构中的堆不一样,更像链表
- 全局/静态区:存放全局变量和静态变量,程序结束时系统释放
- 常量区:存放常量(如字符串常量),程序结束时系统释放
- 代码段:只读,程序结束时系统释放
- 自由存储区(先不算在5区里面):c++基于new关键字的抽象概念,由new开辟的空间都属于自由存储区,new开辟的不一定都在堆中
内存中的布局:由上到下
- 栈stack:
- 堆heap:
- BSS Block Started by Symbol:存放未初始化的全局变量和静态变量,以及初始化为0的全局变量和静态变量
- 数据区Data Segment:存放已经初始化的全局变量和静态变量,以及常量数据
- 代码区Code Segment:也称Text Segment,存放可执行程序的机器码
【变量的区别】
- 基础:
- 五个方面:
- 申请方式:
- 栈:系统自动分配
- 堆:程序员主动申请
- 申请后系统响应:
- 栈:略
- 堆:略
- 申请效率:
- 栈:系统自动分配,效率高,但是不能控制
- 堆:程序员自由分配,效率低,使用起来自由方便但是容易产生内部碎片( *** 作系统)
- 内存空间布局情况:
- 栈:在内存中是连续的,向低地址扩展,最大容量是预定好的
- 堆:不连续,向高地址扩展
- 存放内容:
- 栈:局部变量,函数参数
- 堆:内容由程序员控制(不重要)
【内存对齐】
- 基础:
- c++变量作用域有哪些:
- 全局作用域
- 文件作用域
- 命名空间作用域
- 类作用域
- 局部作用域
- 语句作用域
- 四种变量:
- 全局变量:具有全局作用域,其他源文件可以通过extern关键字重新声明来访问
- 静态全局变量:具有文件作用域,其他源文件不能使用
- 局部变量:
- 静态局部变量:
- 问答:
- 问:变量区别
- 答:
- 变量作用域有哪些
- 变量类型
【内存泄漏】
- 为什么要内存对齐:cpu对内存中的数据存取更方便
- 举例:
X86是32位 *** 作系统 x64是64位 *** 作系统
一行是32位
- struct { int i, char c1, char c2}:大小为8
- struct { char c1, int i, char c2}:大小为12
- struct { char c1, char c2, int i}:大小为8
- 问答:
- 什么是内存泄漏:由于疏忽或者错误导致程序未能释放掉不再使用的内存
- 导致内存泄露的情况:
- 通过malloc、new等分配内存时,忘记free或者delete
- 基类析构函数不是虚析构时,可能导致析构对象时,未能正确析构
- 怎么防止内存泄露
答:
- 深拷贝
- 智能指针
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)