【****❤C++❤****】

【****❤C++❤****】,第1张

【C++程序编译过程】

一)过程:预处理(cpp->.i文件<进行预编译之后生成的文件>)——编译(.i文件->.s文件<汇编语言文件>)——汇编(.s文件->.o文件<目标文件>)——链接

二)详细内容

1.预处理:处理以#开头的文件

2.编译:进行词法分析、语法分析、语义分析及优化后生成汇编代码文件

3.汇编:将汇编语言转换成机器语言

4.链接:将各个目标文件组装起来

三)链接方式

1.静态链接:.a/.lib

1)静态链接含义:将调用的库打包装进可执行文件,运行时不需要再调用库。但是链接时可能同一个库链接了好几次,浪费空间。

2)静态链接优缺点:

优点:速度快

缺点:浪费空间,更新困难

2.动态链接:.so/.dll

  1. 动态链接含义:程序运行时,动态库内容会被放入相应的地址空间,然后可执行文件进行调用
  2. 动态链接优缺点:优点:节省空间,容易更新                缺点:浪费时间
【C++内存管理】

五个区:

  1. 栈:编译器自动释放,存放局部变量,类似数据结构中的栈
  2. 堆:程序员手动释放,若程序员不释放,程序结束时可能由 *** 作系统释放,和数据结构中的堆不一样,更像链表
  3. 全局/静态区:存放全局变量和静态变量,程序结束时系统释放
  4. 常量区:存放常量(如字符串常量),程序结束时系统释放
  5. 代码段:只读,程序结束时系统释放
  6. 自由存储区(先不算在5区里面):c++基于new关键字的抽象概念,由new开辟的空间都属于自由存储区,new开辟的不一定都在堆中

内存中的布局:由上到下

  1. 栈stack:
  2. 堆heap:
  3. BSS   Block Started by Symbol:存放未初始化的全局变量和静态变量,以及初始化为0的全局变量和静态变量
  4. 数据区Data Segment:存放已经初始化的全局变量和静态变量,以及常量数据
  5. 代码区Code Segment:也称Text Segment,存放可执行程序的机器码

【堆和栈的区别】
  • 基础:
  • 五个方面:
  1. 申请方式:
  1. 栈:系统自动分配
  2. 堆:程序员主动申请

  1. 申请后系统响应:
  1. 栈:略
  2. 堆:略

  1. 申请效率:
  1. 栈:系统自动分配,效率高,但是不能控制
  2. 堆:程序员自由分配,效率低,使用起来自由方便但是容易产生内部碎片( *** 作系统)

  1. 内存空间布局情况:
  1. 栈:在内存中是连续的,向低地址扩展,最大容量是预定好的
  2. 堆:不连续,向高地址扩展

  1. 存放内容:
  1. 栈:局部变量,函数参数
  2. 堆:内容由程序员控制(不重要)
【变量的区别】
  • 基础:
  • c++变量作用域有哪些:
  1. 全局作用域
  2. 文件作用域
  3. 命名空间作用域
  4. 类作用域
  5. 局部作用域
  6. 语句作用域

  • 四种变量:
  1. 全局变量:具有全局作用域,其他源文件可以通过extern关键字重新声明来访问
  2. 静态全局变量:具有文件作用域,其他源文件不能使用
  3. 局部变量:
  4. 静态局部变量:

  • 问答:
  • 问:变量区别
  • 答:
  1. 变量作用域有哪些
  2. 变量类型

【内存对齐】
  • 为什么要内存对齐:cpu对内存中的数据存取更方便
  • 举例:

X86是32位 *** 作系统    x64是64位 *** 作系统

一行是32位

  1. struct { int i, char c1, char c2}:大小为8
  2. struct { char c1, int i, char c2}:大小为12
  3. struct { char c1, char c2, int i}:大小为8

【内存泄漏】
  • 问答:
  • 什么是内存泄漏:由于疏忽或者错误导致程序未能释放掉不再使用的内存

  • 导致内存泄露的情况
  1. 通过malloc、new等分配内存时,忘记free或者delete
  2. 基类析构函数不是虚析构时,可能导致析构对象时,未能正确析构

  1. 怎么防止内存泄露

答:

  • 深拷贝
  • 智能指针

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1499005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存