C++八股文-03

C++八股文-03

`


前言

本系列主要的目的是找工作,要记!里面的内容大部分来源于网络,以及自己的一些理解和总结!如果有错误的地方,希望各位大佬指正!
(听说点赞收藏+关注的人都会进大厂噢!加油!!)
参考以及补充 传送门


一、简述C和C++的区别

(1)思想上:
C是面向过程的,它的主要特点是函数。编程思想是将问题分解成不同的步骤,并调用函数来依次实现这些步骤。
C++是面向对象的,它的主要特点是类和对象。编程思想是将数据和数据操作封装成不同的类,通过创建这些类的对象并调用对象的成员函数来实现对数据模型的操作。

(2)应用上:
C的应用更偏底层,常常用于嵌入式开发、驱动开发等直接与硬件交互的领域。
C++由于它优秀的面向对象机制,在大型应用程序的开发方面也表现出色。

C++是对C的扩充。除了添加了面向对象机制以外,C++还添加的机制常用到的有:**类模板、异常处理、运算符重载、标准模板库(STL)、命名空间(namespace)、流(stream)**等等。

二、C程序从源程序到二进制机器代码的过程和gcc指令

gcc 和 g++现在是gnu中最主要和最流行的c & c++编译器 .gcc/g++在执行编译工作的时候,总共需要以下几步:
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
eg:gcc编译源代码hello.c的过程
在这里插入图片描述

  1. 预处理(Preprocessing):gcc -E hello.c -o hello.i
    处理所有预编译指令,即源代码文件中以“#”开头的指令,具体为:
    a. 展开宏定义#define。
    b. 处理条件编译指令#ifdef。
    c. 处理文件包含指令#include。
    d. 删除注释"//“和”/* */"。
    e. 添加行号和文件标识,便于编译器在编译阶段产生错误和警告提示时能够显示行号。

  2. 编译(Compilation):gcc -S hello.i -o hello.s
    对预处理后的文件进行词法分析、语法分析、语义分析、中间代码的生成和优化,最后得到汇编代码文件
    a. 词法分析(Lexical analysis):词法分析器会从左到右逐个字符读入源程序,按照词法规则将源代码分割成一个个单词(Token),检查词法错误,并输出二元组<单词类别,单词属性>方便后续编译过程的引用。
    b. 语法分析(Syntax analysis):识别由词法分析器输出的单词符号序列,构造一棵语法树。语法树指出了词法单元流的语法结构,可以判断是否符合语法规范。常见的语法分析方法分为自下而上和自上而下两大方法。
    c. 语义分析(Semantic analysis):使用语法树和单词符号表中的信息,进一步检查源程序是否满足语言定义的语义约束。这一步分析的时静态语义,也就是在编译期间能分析的语义,而动态语义指在运行期间才能确定的语义。
    d. 中间代码生成:根据语义分析的输出,生成类机器语言的中间代码,如三地址代码。
    e. 中间代码优化:改进中间代码的质量。
    f. 目标代码生成:将中间代码映射成目标语言(汇编语言)。

  3. 汇编(Assembly):gcc -c hello.s -o hello.o
    汇编器将汇编代码翻译成可执行的机器码。每一条汇编语句对应一条机器指令,因此汇编器的工作就是根据汇编指令和机器指令的对照表一一翻译过来即可。

  4. 链接(Linking):gcc hello.o -o hello
    链接器将多个汇编后得到的机器码文件链接,从而生成一个可执行程序。分为静态链接和动态链接两种方式。
    a. 静态链接:在链接可执行文件时,链接器会找到所有被用到的源代码,将它们复制并组合起来形成一个可执行文件。优点是由于可执行文件中已经具备了执行程序需要的全部内容,因此执行时运行速度较快。缺点是如果有多个可执行程序需要引用同一个目标文件,每个可执行程序都会复制一份该文件的副本,造成空间浪费;另外,如果某个目标文件被修改了,则所有引用该文件的可执行程序都需要重新编译。
    b. 动态链接:程序被拆分成独立的部分存储,只有运行时才链接在一起形成完整的程序。优点是即使多个程序依赖同一个动态链接库,也不需要将这个库复制多份,而是所有程序共享这个库;此外在程序更新时只更新被修改的库,不需要重新链接所有程序。缺点是因为将链接过程推迟到程序运行时期,所以会对程序性能产生损失。

三、C程序的内存管理

C或C++语言编写的程序在处理机上运行,通常被分成五段:

栈区:存放函数中声明的局部变量、函数的形参和返回值。地址空间“向下减少”。

堆区:保存动态分配的内存区域,可由程序员向操作系统申请和自行释放。

静态区(全局区):存储全局变量和静态变量。静态区内存程序开始时创建,直到程序运行结束后才会被释放。

常量区:保存常量,在程序运行期间不能被修改的量,如字符串常量"abcd"。

代码区:存放程序代码,二进制机器指令形式,只读。

四、堆和栈的区别

在这里插入图片描述

五、内存泄漏

内存泄漏,通常指堆内存泄漏,程序员向系统申请任意大小的堆内存块,使用完毕必须进行显式的内存释放,否则该内存不能再次被使用。即使用malloc、realloc、new申请的空间,必须使用free、delete进行释放。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杜在学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值