知识列表
- C++程序在预处理的时候具体做什么,在编译的时候具体做什么,在链接的时候具体做什么
- OSI七层模型和TCP/IP模型的区别
1.C++程序在预处理的时候具体做什么,在编译的时候具体做什么,在链接的时候具体做什么
- 预处理阶段在预处理阶段,会处理以#开头的指令
- 文件包含:处理
#include
指令,将指定的头文件的内容插入到源文件中。这允许程序使用库和其他模块的定义和声明。 - 宏替换:处理
#define
指令定义的宏,将宏名称替换为其对应的值。这包括简单的文本替换和条件编译。 - 条件编译:处理
#ifdef
、#ifndef
、#if
、#else
、#elif
和#endif
等指令,以决定哪些代码块应该被编译。这对于实现跨平台代码或根据不同的编译选项来启用/禁用功能非常有用。 - 删除注释:移除源代码中的注释,确保它们不会影响编译过程。
- 行号和文件信息:在预处理过程中,编译器会生成源代码的行号和文件信息,以便在编译错误时提供更好的调试信息。
- 文件包含:处理
- 编译阶段在编译阶段,编译器将预处理后的代码转换为目标代码(通常是汇编语言或机器代码)。这个阶段的主要任务包括:
- 语法分析:检查代码的语法是否正确,构建语法树或抽象语法树(AST)。
- 语义分析:确保程序的语义是正确的,例如类型检查、作用域解析等。
- 生成中间代码:将源代码转换为中间表示(IR),这是一种与平台无关的代码表示形式。
- 优化:对中间代码进行各种优化,以提高生成代码的性能和效率。这可能包括常量折叠、死代码消除、循环优化等。
- 生成目标代码:将优化后的中间代码转换为特定平台的机器代码,生成目标文件(通常是
.o
或.obj
文件)。
- 类型检查:编译器会检查函数声明的参数类型和返回类型,以确保在调用时使用了正确的参数类型。
- 符号管理:编译器会为函数声明生成符号,以便在后续的编译过程中进行链接。
- 作用域解析:编译器会确定函数声明的作用域,确保在同一作用域中不会出现重名的函数。
- 生成代码:编译器会将函数的实现转换为机器代码或中间代码。
- 符号管理:将函数的实现与之前的声明关联起来,确保在链接阶段能够找到函数的定义。
- 优化:编译器可以对函数的实现进行各种优化,例如内联优化(如果函数定义在头文件中并且被标记为
inline
)和循环优化等。
- 语法和语义检查:编译器会检查模板类的语法和语义,确保模板参数的使用是正确的。
- 延迟实例化:模板类的实例化通常是延迟的,编译器不会立即生成代码,直到模板被具体类型实例化时才会生成相应的代码。
- 符号管理:编译器会为模板类的声明和定义生成符号,以便在实例化时使用。
- 语法和语义检查:编译器会检查模板函数的语法和语义,确保模板参数的使用是正确的。
- 延迟实例化:模板函数的实例化也是延迟的,编译器直到模板函数被调用并使用具体类型时才会生成相应的代码。
- 生成代码:一旦模板函数被实例化,编译器会生成具体类型的函数代码,并进行优化。
- 符号管理:编译器为模板函数的声明和定义生成符号,以便在实例化时使用。
- 链接阶段
在链接阶段,链接器将一个或多个目标文件和库文件组合成一个可执行文件或共享库。这个阶段的主要任务包括:
- 符号解析:链接器会解析目标文件中的符号(函数名、变量名等),确保所有引用的符号都有对应的定义。
- 地址重定位:根据目标文件中符号的地址,将所有符号的引用和定义调整为正确的内存地址。
- 合并目标文件:将多个目标文件合并成一个可执行文件,处理文件中的代码段、数据段等。
- 库链接:将所需的库(静态库或动态库)链接到最终的可执行文件中,确保程序能够使用这些库中的功能。
- 生成可执行文件:最终生成一个可执行文件(如
.exe
或没有扩展名的文件),可以在操作系统中运行。
2.OSI七层模型和TCP/IP模型的区别
OSI七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/IP模型:网络接口层,网络层,传输层,应用层
OSI七层模型
1. 物理层(Physical Layer)
- 作用: 物理层负责传输原始比特流(0 和 1)通过物理介质(如电缆、光纤、无线信号等)。它定义了电气特性、机械特性、信号传输方式等。
- 功能:
- 确定物理连接的类型(如串行、并行、光纤等)。
- 定义电压、电流、传输速率、信号编码等。
- 处理物理设备的接口(如网卡、调制解调器等)。
2. 数据链路层(Data Link Layer)
- 作用: 数据链路层提供点对点的可靠数据传输,主要负责在物理层上建立、维护和断开连接。它还负责数据帧的封装和解封装。
- 功能:
- 将网络层传来的数据包封装成帧。
- 提供错误检测和纠正(如 CRC 校验)。
- 控制数据流,防止数据包碰撞(如 CSMA/CD、CSMA/CA)。
- 处理物理地址(MAC 地址)。
3. 网络层(Network Layer)
- 作用: 网络层负责数据包的路由选择和转发,确保数据从源到目的地的传输。它处理逻辑地址(IP 地址)并提供分段和重组功能。
- 功能:
- 路由选择:决定数据包从源到目的地的最佳路径。
- 分段和重组:将较大的数据包分段以适应网络的传输限制,并在目的地重新组合。
- 提供逻辑地址(如 IP 地址)以便于识别网络中的设备。
4. 传输层(Transport Layer)
- 作用: 传输层负责在主机之间提供可靠或不可靠的数据传输服务,确保数据完整性和顺序。它可以提供流量控制和错误恢复。
- 功能:
- 提供端到端的通信,确保数据的完整性和顺序。
- 分段和重组数据(如 TCP 和 UDP)。
- 提供流量控制,防止接收方被数据淹没。
- 提供错误检测和恢复机制。
5.会话层(Session Layer)
- 作用: 会话层负责建立、管理和终止会话(连接),确保在通信的两个主机之间进行有效的对话。
- 功能:
- 建立和维护会话,提供会话恢复功能。
- 管理会话的同步和数据交换。
- 处理会话的控制信息(如标识符、状态等)。
6. 表示层(Presentation Layer)
- 作用: 表示层负责数据的格式化、编码和加密,确保数据能够被应用层理解。它处理数据的表示方式。
- 功能:
- 数据格式转换(如 ASCII、EBCDIC、JPEG、MPEG 等)。
- 数据加密和解密,确保数据的安全性。
- 数据压缩和解压缩,减少传输的数据量。
7. 应用层(Application Layer)
- 作用: 应用层是OSI模型的最上层,直接与用户和应用程序交互。它提供用户接口和各种网络服务。
- 功能:
- 提供用户直接访问网络服务的接口(如 HTTP、FTP、SMTP、DNS 等)。
- 定义应用程序间的协议和数据格式。
- 处理用户请求和响应。
TCP/IP模型
1. 网络接口层(Network Interface Layer)
- 作用: 网络接口层负责在物理网络上发送和接收数据帧。它对应于OSI模型的物理层和数据链路层,处理数据的物理传输和局域网的帧封装。
- 功能:
- 处理物理设备的接口和网络媒介(如以太网、Wi-Fi等)。
- 定义如何在网络中传输数据帧,包括帧的封装和解封装。
- 进行物理地址(如MAC地址)的管理。
- 处理局域网和广域网之间的连接,确保数据能够在不同网络之间传输。
2. 网络层(Internet Layer)
- 作用: 网络层负责数据包的路由选择和转发,确保数据从源主机到目的主机的传输。它处理逻辑地址(如IP地址)并提供分段和重组功能。
- 功能:
- 路由选择:决定数据包从源到目的的最佳路径,使用路由协议(如RIP、OSPF、BGP等)。
- 数据包封装和解封装:将上层传来的数据封装成IP数据包,并在接收时进行解封装。
- 提供逻辑地址(如IPv4或IPv6地址),以识别网络中的设备。
- 处理分段和重组:将较大的数据包分段以适应网络的传输限制,并在目的地重新组合。
3. 传输层(Transport Layer)
- 作用: 传输层负责在主机之间提供可靠或不可靠的数据传输服务,确保数据的完整性和顺序。它能够支持多种传输协议,如TCP和UDP。
- 功能:
- 提供端到端的通信,确保数据的完整性和顺序。
- 处理数据的分段和重组(例如,TCP通过序列号和确认机制确保数据的可靠传输)。
- 提供流量控制,防止接收方被数据淹没。
- 提供错误检测和恢复机制(如TCP使用校验和来检测错误)。
- 支持两种主要的传输协议:
- TCP(传输控制协议): 提供面向连接的、可靠的数据传输,确保数据的顺序和完整性。
- UDP(用户数据报协议): 提供无连接的、不可靠的数据传输,适用于对速度要求高而对可靠性要求低的应用(如视频流、在线游戏等)。
4. 应用层(Application Layer)
- 作用: 应用层是TCP/IP模型的最上层,直接与用户和应用程序交互。它提供用户接口和各种网络服务。
- 功能:
- 提供用户直接访问网络服务的接口。应用层协议定义了应用程序如何通过网络进行通信。
- 处理应用程序间的协议和数据格式(如HTTP、FTP、SMTP、DNS等)。
- 负责数据的表示和处理,将用户的请求转换为网络可传输的数据,并在接收时进行相应的解码。
- 常用的应用层协议包括:
- HTTP(超文本传输协议): 用于网页浏览。
- FTP(文件传输协议): 用于文件传输。
- SMTP(简单邮件传输协议): 用于电子邮件发送。
- DNS(域名系统): 用于将域名解析为IP地址。