【C++复习2】C++编译器的工作原理
如果你是一名newbird的话,建议观看如下视频加深你的理解,再看如下内容:
https://www.bilibili.com/video/BV1N24y1B7nQ?p=7
The cherno会额外告诉你如何将目标文件转换成汇编代码,CPU执行指令的过程以及编译器如何通过删除冗余变量,进行优化等知识。
声明:
以下内容均是chatGpt生成与对该视频总结获得的,希望对大家有所帮助。
什么是C++编译器
C++编译器是将C++源代码转换为可执行程序的软件工具,比如最出名的Visual Studio。
工作原理
其工作原理可以分为三个主要阶段:预处理、编译和链接。
1. 预处理
预处理阶段处理源代码中的预处理指令,如#include
和#define
等,并将它们替换为源代码。
预处理器还可以执行条件编译,根据代码中定义的条件来包含或排除代码。处理完成后,生成经过预处理的源代码。
2. 编译
编译阶段将预处理的源代码转换为中间代码,包括生成抽象语法树等操作。
编译器对代码进行词法分析和语法分析,并对代码进行语义检查,以确保其符合C++语言规范。然后,编译器将中间代码转换为机器代码,生成目标文件。
2.1 什么是中间代码?
C++编译器在编译阶段会将预处理后的源代码转换为中间代码,也称为目标代码(Object Code)。
特性:
这些中间代码是与平台无关的低级代码,通常是二进制格式或汇编代码。
具体来说,编译器会将源代码转换为抽象语法树(AST)。
2.2 什么是AST
概念:
AST是编译器在编译过程中使用的一种数据结构,用于表示源代码的语法结构。
编译器会对AST进行一系列的优化和转换,以生成目标代码。这些优化包括删除冗余代码、提取公共子表达式、常量折叠等。
生成的中间代码是与平台无关的,因为它们没有针对特定的CPU架构进行优化。在链接阶段,链接器将这些目标文件合并成一个可执行文件,并将其与操作系统和CPU架构相关的库文件链接起来,生成最终的可执行文件。
3. 链接
链接阶段将多个目标文件和库文件合并成一个可执行文件。
链接器会解析代码中的符号,找到其定义并将其连接起来。这些符号可能来自其他目标文件或库文件。
3.1 具体例子
假设我们有两个C++源代码文件,一个是main.cpp
,一个是hello.cpp
。main.cpp
调用了hello.cpp
中的一个函数,需要将它们链接起来才能生成可执行文件。
现在main.cpp
,内容如下:
#include <iostream>
#include "hello.h"int main() {hello();return 0;
}
另一个是hello.cpp
,内容如下:
#include <iostream>
#include "hello.h"void hello() {std::cout << "Hello, world!" << std::endl;
}
还有一个头文件hello.h
,内容如下:
#ifndef HELLO_H
#define HELLO_Hvoid hello();#endif
当我们运行时,会按如下的命令编译这些代码:
$ g++ -c main.cpp
$ g++ -c hello.cpp
$ g++ -o hello main.o hello.o
第一条命令将main.cpp
编译为main.o
目标文件,第二条命令将hello.cpp
编译为hello.o
目标文件,最后一条命令将两个目标文件链接起来,生成可执行文件hello
。
我们可以执行./hello
命令来运行程序,结果应该输出"Hello, world!"
(ChatGpt说的,我没测试,但是逻辑很合理的样子)。
可以看到在链接阶段,链接器将main.o
和hello.o
文件合并为一个可执行文件。首先,链接器会对目标文件进行符号解析,找到main.o
中调用hello.cpp
函数的符号引用,并在hello.o
中找到符号定义。然后,链接器将引用和定义链接起来,生成可执行文件。
3.2 额外问题(符号冲突的问题)
概念:
链接器还需要解决符号冲突的问题。当多个目标文件中存在相同的符号定义时,链接器会报告错误,因为无法判断应该使用哪个定义。
解决方案:
为了解决这个问题,C++提供了一些机制。
- 在头文件中声明函数或变量为
extern
,在链接阶段不进行符号解析,而是在运行时再进行解析。 - 此外,链接器还可以使用静态库或动态库来解决符号冲突问题。静态库在链接阶段被直接合并到可执行文件中,而动态库在运行时加载到内存中。
4. 总结
最终生成的可执行文件可以在计算机上运行,执行程序所描述的操作。
总的来说,C++编译器的工作原理是将源代码转换为可执行文件的过程,通过预处理、编译和链接三个阶段实现。
相关文章:
【C++复习2】C++编译器的工作原理
如果你是一名newbird的话,建议观看如下视频加深你的理解,再看如下内容: https://www.bilibili.com/video/BV1N24y1B7nQ?p7 The cherno会额外告诉你如何将目标文件转换成汇编代码,CPU执行指令的过程以及编译器如何通过删除冗余变…...
回调函数_回顾
函数指针和回调函数 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 直接用指针表示函数,而不是*指针ÿ…...
今天面了个字节跳动拿35K出来的,真是砂纸擦屁股,给我露了一手啊
今年的金三银四已经结束,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好,他山之…...
8. 数据结构与算法
8. 数据结构与算法 常见面试题 说说一个算法有哪些时间复杂度?归并算法时间复杂度是多少?⭐⭐⭐ O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) 归并算法时间复杂度是O(nlogn) 说说数组时间复杂度,什么场景下使用?⭐⭐⭐⭐⭐ 从渐进趋势…...
Springboot +Flowable,任务认领和回退(一)
一.简介 有的时候,一个任务节点会存在多个候选人,例如:张三提交一个任务,这个任务即可以由李四处理,又可以由王五处理,那么针对这种多个任务候选人的情况,该如何处理? 二.绘制流程…...
机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑
机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑 目录 机器学习 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络模型答疑问题汇总问题一答疑问题二答疑问题三答疑问题四答疑问题五答疑参考资料问题汇总 有几个问题咨询一下: 1.数据集划分时出现了问题如何解决? 2…...
卷首语:我决定从零开始,用C++手写自己的键值数据库
2023年5月1日,周一下午。 我为什么要自己写一个? 今天中午,我在CSDN上提出了一个关于如何学习C的观点——通过用C造东西来学习C,于是为了实践这个观点,我决定用C手写一个简单的属于自己的键值数据库。 我会把这个键值…...
【Vue】收集表单数据 过滤器
收集表单数据 收集表单数据: 若:<input type"text"/>,则v-model收集的是value值,用户输入的就是value值若:<input type"radio"/>,则v-model收集的是value值,且要给标签配置value值若…...
Linux线程:死锁
1. 死锁 (1)概念 死锁(DeadLock)指两个或两个以上的进程或线程执行时,由于竞争临界资源而造成阻塞的现象;若不干涉,则无法推进下去。 (2)死锁的原因 ① 竞争临界资源…...
thinkphp+vue+html超市零食品美食推荐系统零食购物商城网站7v281
本系统的开发使获取食品推荐系统信息能够更加方便快捷,同时也使食品推荐系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作 运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vu…...
思考外语学习的底层逻辑(以英语、法语为例)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言一、英语1.学习历程2.英语学习的心得3.理论检验(持续更新) 二、法语1.学习历程2.读入数据 总结 前言 提示:这里谈谈自己为什么要…...
命名ACL配置
命名ACL配置 【实验目的】 掌握命名ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255.255.255.252 N/A Fa0/0 192.168.2.1 255.255.…...
2008-2019年主要城市PITI指数
2008-2019年主要城市PITI指数 1、来源:附在文件内 2、时间区间:2008-2019年 3、具体时间分布:、2008、2009-2010、2011、2012、2013-2014、2014-2015、2015-2016、2016-2017、2017-2018、2018-2019、 4、范围:包括110个城市&a…...
拷贝构造函数和赋值重载函数详解
1.拷贝构造函数 1.1拷贝构造函数的概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数,其特征如下&#…...
5件关于JavaScript中this参数的事
this 关键字是 JavaScript 中最令人困惑的部分之一,本文试图通过介绍有关它的五个重要事项来阐明其目的和用法。 1、它允许访问同一对象上的其他属性 在 JavaScript 中,函数可以是独立的单元,但它们也可以用作对象的值。考虑下一个对象。 …...
面试题30天打卡-day17
1、什么是内部类? 内部类的分类有哪些 ?内部类的优点 ,内部类有哪些应用场景? 内部类:在一个类中创建一个新的类 内部类主要分为以下4种:成员内部类、局部内部类、静态内部类、匿名内部类。 成员内部类 …...
对标世界一流|弹性应对“供应链不确定性常态化” ——快消与重资产行业的经验互鉴
1963年,气象学家洛伦兹提出的“蝴蝶效应”表示:“一只蝴蝶在巴西扇动翅膀,有可能会在美国德克萨斯州引起一场龙卷风”。本文希望通过提供快消行业的先进实践,帮助重资产企业从“蝴蝶扇动翅膀”之前就开始行动,避免“龙…...
【MPC|云储能】基于模型预测控制(MPC)的微电网调度优化的研究(matlab代码)
目录 1 主要内容 2 程序难点及问题说明 3 部分程序 4 下载链接 1 主要内容 该程序分为两部分,日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面方法,根据每个居民的实际需要得到响应储能充放电功率,优化得到整体…...
796. 子矩阵的和(C++和Python3)——2023.5.6打卡
文章目录 QuestionIdeasCode Question 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2 ,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数…...
docker打包部署spring boot应用(mysql+jar+Nginx)
文章目录 一、基本准备二、mysql部署二、jar部署三、Nginx部署 一、基本准备 小唐拿的就是之前放置在我们服务器上的应用进行部署,主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 项目参考:小破站数据大屏可视化(…...
Golang-常见数据结构Slice
Slice slice 翻译成中文就是切片,它和数组(array)很类似,可以用下标的方式进行访问,如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。 了解 slice 的本质, 最简单的方法就是…...
操作系统——设备管理
0.关注博主有更多知识 操作系统入门知识合集 目录 1.设备管理概念 2.SPOOLing技术 1.设备管理概念 在计算中,除CPU、内存以外的所有设备统称为外设,即外部设备,例如鼠标、键盘、打印机、摄像头、磁盘、硬盘......那么这些只需要连接到计…...
图片分类:精细化分类,(Fine-Grained Categorization) 基于人的行为的精细化分类
文字大纲 简介数据集常用数据集方法1 : 强监督方法2 : 弱监督传统 ResNet EfficientNet 等Two Level Attention Model双线性网络 Bilinear CNN model参考文献和学习路径简介 细粒度图像识别 (fine-grained image recognition),即 精细化分类。 细粒度图像分类(Fine-Graine…...
Matlab2012a的图像处理工具箱的imshow函数
在处理图片文件时,除了使用matlab自带的image函数,还可以考虑用matlab的图像处理工具箱。这个工具箱提供了imshow和imtool两个函数,可实现图片的显示。 这两个函数都支持Handle Graphics体系结构,它们可创建图像对象,…...
Linux_红帽8学习笔记分享_10(SELinux管理与防火墙)
Linux_红帽8学习笔记分享_10(SELinux管理与防火墙) 文章目录 Linux_红帽8学习笔记分享_10(**SELinux管理与防火墙**)1.Linux系统的安全机制1.1 Filesystem1.2 Service1.3 Firewall1.4 SELinux 2.SElinux理论概述3.SElinux的配置文件3.1 SELINUX参数3.2 SELINUXTYPE参数 4.查看和…...
【资料分享】
文章目录 前言《408统考,真题&解析(2009-2021)》《Android 移动应用基础教程(Android Studio)(第2版)》黑马程序员 源代码《Hackers & Painters》--Paul Graham《数字电路与逻辑设计(第3版…...
NewBing 还无法访问的几个问题
大部分的AI自媒体都在说,Bing new已经向全世界开放了,我也凑一下这个热闹,用Edge浏览器打开,访问https://www.bing.com/new?ccus 想体验一下Bing new的效果,结果如下: 相信很多人都碰到了这个问题 此体验…...
将 Segment Anything 扩展到医学图像领域
文章目录 前言技术交流SAM 拆解分析从医学角度理解 SAM 的效用MedSAM实验总结 前言 SAM 是一种在自然图像分割方面取得成功的模型,但在医学图像分割方面表现不佳。MedSAM 首次尝试将 SAM 的成功扩展到医学图像,并成为用于分割各种医学图像的通用工具。为…...
毕业5年,技术越来越好,混的却越来越差...
别人都是越来越好,而我是越来越差! 17年,从一个普通的本科毕业,那个时候的我,很迷茫,简历上的求职岗位都不知道写什么,因为家里是农村的,朴实的父母也帮不上什么忙,关于…...
C#实现把txt文本数据快速读取到excel中
主要介绍了C#实现把txt文本数据快速读取到excel中,本文直接给出示例代码,需要的朋友可以参考下 今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源。搜集一些c#操作excel的程序。步骤如下: 下载一个Microsoft.Office.Interop.Excel.dll 在项目中引用。 编…...
网站 keyword title 字数/成品短视频网站源码搭建
1.java当中的四种引用 强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上: 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛…...
岐山县住房和城市建设局网站/婚恋网站排名前十名
第4章 并发编程 4.5 channel channel的传递 在Go语言中channel本身也是一个原生类型,与map之类的类型地位一样,因此channel本身在定义后也可以通过channel来传递。 利用channel的这个可传递特性,我们可以实现非常强大、灵活的系统架构。相比…...
阿里云心选建站/seo技术教程博客
01 chromium较全的开关选项说明 https://peter.sh/experiments/chromium-command-line-switches/ 很多命令行开关项在这个文件中 src\chrome\common\chrome_switches.cc02 如何取消一些不感兴趣的工程 https://blog.csdn.net/dopi/article/details/27662959...
dede 添加演示网站/怎么申请域名建立网站
目录(1)对于异步 I/O 操作的需求(2)异步 I/O API超时处理结果的顺序事件时间容错保证(3)代码实现(1)对于异步 I/O 操作的需求 在与外部系统交互(用数据库中的数据扩充流…...
网站建设费和网站维护费的区别/珠海企业网站建设
sdown和odown转换机制 sdown和odown两种失败状态 sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机 odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机 sdown达成的条件很简…...
中国建设委员会官方网站/360网站收录
关注“潜在价值”,最好的技术商业媒体,了解那些智慧商业 本文由潜在价值旗下 创意产品推荐平台“钛空舱”推出 钛空(ID:TiKong-life) 一个关注于科技与创意生活的选品、荐品平台 新奇、实用、品质保证 一切关于未来生活…...