[杂学笔记]C++编译过程、静态链接库与动态链接库的区别、动态多态的实现机制、虚拟地址空间分布与C++内存分布、volatile的作用以及使用场景

1. C++编译过程

C++编译过程分为:预处理阶段、编译阶段、汇编阶段、链接阶段(.cpp -> .i -> .s -> .o -> 程序)

  • 预处理:预处理阶段会对源代码进行宏替换、条件编译以及删除注释的操作,生成一个纯C++的代码。

  • 编译:将处理后的C++源代码转化为汇编代码,并进行语法、词法分析,检查代码的正确性。

  • 汇编:将汇编代码转化为机器可执行的目标文件

  • 链接:链接阶段是将目标文件与其他目标文件或库文件链接在一起,生成可执行程序。链接器在此期间进行地址重定位、生成符号表、以及解析目标文件中的引用符号,将其和其他目标文件或库文件中的符号定义进行匹配,最终生成一个可执行程序。

2. 静态链接库与动态链接库的区别

  • 链接方式:静态库在编译链接时会完整的拷贝到可执行文件中,成为可执行文件的一部分;动态库在编译链接时只会在可执行文件中包含对库文件的引用,在实际执行的时候,由操作系统进行动态加载。

  • 文件大小:包含静态库的可执行文件会大一些,因为将完整的库文件放到了可执行文件当中;而动态库不会增加可执行文件的大小,因为库代码在运行时才会被加载。

  • 内存占用:静态库在运行时会完整的将程序加载到内存中,内存占用固定;动态库在运行的时候才会被加载,而且可以多进程共享库代码,减少内存占用。

  • 可扩展性:动态链接可以在不更改可执行文件的情况下,修改库文件;而对于静态库的修改,在修改之后必须重新编译链接可执行程序。

3. 动态多态的实现机制

当一个类中存在虚函数时,会生成一个虚函数表,并将函数的地址放入虚函数表中。子类继承该类的时候会继承该虚函数表,在进行虚函数的重写时,会将新定义的虚函数放到虚函数表中,并且覆盖父类的该函数的地址。当父类指针或引用指向子类函数的时候,会访问子类函数的虚函数表,调用的函数是子类覆盖后的地址。

4. 虚拟地址空间分布与C++内存分布

虚拟地址空间分布:

Kernel Space(内核空间) --> 命令行参数与环境变量 --> Stack --> MMAP(内存映射区域) --> Heap --> BSS段(未初始化全局变量与静态变量) --> Data段(已初始化全局变量与静态变量) --> Text段(代码段)

C++内存分布:

内核空间 --> 栈区 --> 堆区 --> 静态区 --> 常量区 --> 代码区

  • 栈区(Stack):由编译器自动分配释放,存放函数的参数值,局部变量等。

  • 堆区(Heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

  • 全局区(静态区)(Static):全局变量和静态变量被分配到同一块内存中。

  • 常量区:是全局区的一部分,存放常量,不允许修改。

  • 代码区(Text):存放函数体的二进制代码。

其中:C++的常量区数据存放在虚拟地址空间中的TEXT区域、静态区数据分类存放在BSS段与Data段

5. volatile的作用以及使用场景

作用:volatile用来禁用编译器的优化,在被volatile修饰之后的对象,不会将对象的值从内存缓存到CPU寄存器中,防止多个线程并发访问的时候,有的使用内存中的值,有的使用寄存器中的值,而导致程序出错。

使用场景:多线程并发访问修改同一个变量的场景

相关推荐
星轨初途3 小时前
数据结构二叉树之链式结构(3)(下)
c语言·网络·数据结构·经验分享·笔记·后端
智者知已应修善业4 小时前
【51单片机LED贪吃蛇】2023-3-27
c语言·c++·经验分享·笔记·嵌入式硬件·51单片机
charlie1145141917 小时前
从 0 开始:在 WSL + VSCode 上利用 Maven 构建 Java Spring Boot 工程
java·笔记·vscode·后端·学习·maven·springboot
思成不止于此14 小时前
【C++ 数据结构】二叉搜索树:原理、实现与核心操作全解析
开发语言·数据结构·c++·笔记·学习·搜索二叉树·c++40周年
碧海潮生_CC15 小时前
【CUDA笔记】03 CUDA GPU 架构与一般的程序优化思路(下)
笔记·架构·cuda
钟屿15 小时前
Back to Basics: Let Denoising Generative Models Denoise 论文阅读学习
论文阅读·人工智能·笔记·学习·计算机视觉
d111111111d15 小时前
SPI通信协议--在STM32中介绍(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
愚昧之山绝望之谷开悟之坡16 小时前
业务接待-公务接待-商务接待
笔记
大数据追光猿17 小时前
LangChain / LangGraph / AutoGPT / CrewAI / AutoGen 五大框架对比
经验分享·笔记·python·langchain·agent