C++编译汇编八股总结

汇编的四个阶段?

预编译(预处理)

  • 预编译是源代码在编译之前进行的一些处理,主要包括宏定义展开条件编译指令处理和头文件展开等。

编译

  • 编译器根据源代码的语法和语义规则,将源代码进行词法分析、语法分析、语义分析、优化等一系列处理,最终生成相应的汇编代码。
  • 在这个过程中,编译器会对源代码进行错误检查,发现语法、语义等错误并提示。

汇编

  • 汇编是将编译过程产生的汇编代码转换为是机器代码的过程。
  • 机器代码是计算机可以直接理解和执行的二进制指令。
  • 汇编过程中,汇编器还会计算各种地址和指针值生成静态数据等信息,以便在链接过程中使用。

链接

  • 链接是将一个或多个目标文件合并为一个可执行文件的过程。
  • 符号解析:在多个目标文件和库文件中查找并匹配未定义的如函数、变量等,并将它们关联到正确的定义。
  • 链接过程可以分为静态链接和动态链接两种。
  • 最终,链接器会生成一个包含了所有必要代码和数据的可执行文件,可以在目标计算机上运行。

 静态库和动态库?

区别

文件格式

  • 静态库:通常以 .lib(Windows)或 .a(Linux/UNIX)为扩展名。
  • 动态库:通常以 .dll(Windows)或 .so(Linux/UNIX)为扩展名。

链接方式

静态库

  • 编译过程
    1. 编译器将源代码编译为目标文件(.o 或 .obj)。
    2. 静态库(.a 或 .lib)通过静态链接器(如 ar 或 link.exe)打包多个目标文件。
    3. 程序编译时,静态库中的代码被直接复制到最终的可执行文件中。

动态库

  • 编译过程
  1. 动态库编译为独立的二进制文件(如 .dll 或 .so)。
  2. 程序编译时仅记录对动态库的引用(如函数名、符号表)。
  3. 程序运行时,操作系统动态加载库到内存中。

程序加载时间

  • 静态库:因为所有库代码都已链接到可执行文件,程序加载时间相对较短。
  • 动态库:程序在运行时需要加载和链接动态库,这可能导致程序启动时间稍长。

如何生成静态库和动态库?

生成静态库 (.a 文件)

首先,使用 -c 标志将源文件编译为目标文件(.o 文件):

g++ -c -o example.o example.cpp

然后,使用 ar 命令将目标文件打包为静态库:

ar rcs libexample.a example.o

现在已经创建了名为 libexample.a 的静态库。

生成动态库 (.so 文件)

编译源文件时,添加 -fPIC 标志来生成位置无关代码:

g++ -c -fPIC -o example.o example.cpp

使用 -shared 标志将目标文件链接为动态库:

g++ -shared -o libexample.so example.o

现在已经创建了名为 libexample.so 的动态库。

 静态链接和动态链接的区别?

静态链接

  • 在编译阶段,静态库(.a 或 .lib文件)中的目标代码被直接链接到最终的可执行文件中。因此,所有程序需要的库代码都包含在最终的二进制文件中。
  • 当程序运行时,不需要额外的库文件。
  • 静态链接的优点程序运行时的性能提升(因为不需要动态库的加载和解析)。
  • 静态链接的缺点包括更大的可执行文件大小(因为包含了所有库代码)和更新库文件时需要重新编译程序。

动态链接

  • 在编译阶段,程序与动态库.so 或 .dll文件)建立引用关系。程序在运行时动态地加载和链接这些库文件。
  • 当程序运行时,需要确保动态库文件在系统的库搜索路径中。否则,程序将无法启动,因为找不到所需的库。
  • 动态链接的优点包括更小的可执行文件大小,以及多个程序可以共享相同的库文件,从而节省内存和磁盘空间。此外,更新库文件时无需重新编译程序,只需替换库文件即可。
  • 动态链接的缺点程序运行时性能可能较低(因为需要加载和链接动态库)。

编译期间,为什么我们要为头文件添加保护?

为了防止头文件被多次包含(include)和重复定义,避免编译错误和冗余编译。

#ifndef MY_HEADER_H
#define MY_HEADER_H// 头文件内容#endif // MY_HEADER_H
  • 预处理器检查是否已经定义了名为 MY_HEADER_H 的宏(即 #ifndef MY_HEADER_H)。
  • 如果该宏尚未定义,预处理器会定义它(即 #define MY_HEADER_H),然后包含头文件的内容。这样,头文件内容在本次编译中只会被包含一次。
  • 如果该宏已经定义,说明头文件已经被包含过,预处理器会跳过整个头文件内容,避免重复包含和定义。

什么是宏?宏的优缺点是什么?

        宏(Macro)是C和C++编程语言中的一种预处理器指令,允许在编译前定义和替换文本和代码。宏通过预处理器(preprocessor)进行文本替换,只是简单的文本替换。宏的定义通常使用 #define 指令,可以用于定义常量、简单的函数等。

宏的优点

  • 提高代码重用性:宏允许定义一段代码或文本,然后在多个地方使用。这有助于减少重复代码和提高代码可维护性。
  • 提高性能:宏在编译阶段进行替换,因此可以避免函数调用带来的性能开销。

宏的缺点

  • 命名冲突:宏的命名空间是全局的,这可能导致命名冲突。如果在不同的头文件或源文件中定义了相同名称的宏,可能会引发意外的替换和编译错误。
  • 类型不安全:宏没有类型检查,这可能导致类型错误。由于宏只是文本替换,因此在替换过程中可能会产生错误的类型组合,导致运行时错误或未定义行为。

内联函数和宏定义的区别?

内联函数
  • 内联函数是一种在编译时展开的函数,使用关键字 inline 进行声明。
  • 内联函数具有类型检查,能确保参数和返回值类型的正确性。
  • 内联函数遵循正常的作用域规则和访问控制。
  • 内联inline只是一种建议,编译器也可能不采用内联还是使用函数调用的方式。
宏定义
  • 宏定义是预处理器的一部分,使用 #define 指令定义。
  • 宏定义没有类型检查,可能导致类型错误或未定义行为。
  • 宏定义不遵循正常的作用域规则和访问控制,它们是全局的。
  • 宏定义总是在编译阶段进行文本替换,因此没有函数调用的开销

C++中的extern "C"是什么意思?为什么要用它?

概念

extern "C"是一个链接指定符,用于告诉C++编译器在链接时如何处理被声明的函数或变量。它的主要目的是实现C和C++之间的互操作性。

解释

        C++支持函数重载,可以在同一个作用域内使用相同的函数名,但参数列表不同。为了支持这个特性,C++编译器在生成目标代码时会对函数名进行名字修饰,以便在链接时区分具有相同名称的不同函数

        然而,C编译器并不支持函数重载,也不对函数名进行名字修饰(name mangling)。因此,当试图在C++中调用C函数或在C代码中调用C++函数时,可能会出现链接错误,因为链接器找不到正确的符号。

        为了解决这个问题,可以使用extern "C"。当在C++代码中使用extern "C"声明一个函数或变量时,C++编译器会禁用名字修饰,使得函数或变量的名字与C编译器生成的名字相同。这样,在链接时就可以正确地找到符号,实现C和C++之间的互操作性。

C++编译器如何处理函数重载?

C++编译器处理函数重载的过程主要包括两个阶段:重载解析(Overload Resolution)和名字修饰(Name Mangling)。

  • 重载解析(Overload Resolution): 当在同一作用域内存在多个同名函数时,编译器需要根据调用点的参数类型和数量来确定调用哪个函数。
  • 名字修饰(Name Mangling): 重载解析确定了要调用哪个函数之后,编译器需要为这些重载函数生成独特的二进制符号名

编译错误与运行时错误的区别?

编译错误是在编译阶段发生的错误。编译器会将程序员编写的源代码转换为汇编代码。

  • 编译错误通常是由于程序员的失误,比如语法错误、类型不匹配、未定义的变量或函数等。
  • 运行时错误是在程序执行阶段发生的错误。运行时错误通常是由于程序的逻辑错误、资源限制或外部输入导致的。常见错误除以零、数组越界、空指针解引用、内存泄漏等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35839.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题 | ACOS(X) 与 ACOSD(X)的区别

github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 [TOC](ACOS(X) 与 ACOSD(X)的区别) ACOSD(X) 是反余弦函数,结果以角度形式表示。ACOS(X) 用于计算 X 中每个元素的反余弦值。当 X 为复数时,结…

两款软件助力图片视频去水印及图像编辑

今天给大家分享两款呼声很高的软件,它们都能处理图片和视频去水印相关的问题。其中一款软件在去水印的同时,图像编辑功能也十分出色;另一款软件专注于图片和视频去水印,去除效果好且支持批量处理。下面就来详细了解一下。 Remover…

Hessian矩阵详解与应用

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…

【软件系统架构】单体架构

一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…

[C++初阶] :从C到C++

目录 C发展史,C语言的特性C新增关键字namespace关键字C语言的命名缺陷(重定义现象)域与指定访问操作符 “::”命名空间域详解namespace std C的输入与输出函数重载什么是重载,重载的几种常见形态重载的作用注意不构成重载的情况 缺省参数1.全…

[快乐学坊management_1] With Cursor | Mysql设计 | 服务接口设计与开发

目录 数据库设计流程 三张表 测试 接口设计 部门管理接口文档 1. 查询所有部门 2. 新增部门 ⭕3. 根据ID查询部门 4. 修改部门 5. 删除部门 (部门分页条件查询) 错误响应示例 接口设计规范 服务端开发 接口开发 数据库设计流程 01 明确业…

实用插件推荐 -------- 一个可以将任意语言(python、C/C++、go、java等)的程序转换为汇编语言的小插件

链接为: Compiler Explorer 界面: 参考自:如何获取虚函数表及内存分析_com的虚函数表怎么寻找-CSDN博客

vue学习八

十七 组件通信方式 1 props 父传子 //父组件 <script setup>//book来源省略import Subview1 from ./Subview1.vue;function updatebook(updatetimes){book.value.updatetimes updatetimes} </script> <template><Subview1 :book"book" :upd…

51单片机的寻址方式(完整)

目录 一、立即数寻址 二、直接寻址 三、寄存器寻址 四、寄存器间接寻址 五、变址寻址 六、位寻址 七、指令寻址 &#xff08;一&#xff09;绝对寻址 &#xff08;二&#xff09;相对寻址 在 51 单片机中&#xff0c;寻址方式是指在执行指令时&#xff0c;CPU 寻找操作…

每日一题:动态规划

如题&#xff08;基础题&#xff09;&#xff1a; 经典的爬楼梯问题&#xff0c;先从递归想起&#xff1b; class Solution { public:int climbStairs(int n) {if(n1)return 1;if(n2)return 2;return climbStairs(n-1)climbStairs(n-2);} }; 之后可以想办法&#xff08;如哈希…

【论文阅读】FairCLIP - 医疗视觉语言学习中的公平性提升

FairCLIP - 医疗视觉语言学习中的公平性提升 1.研究背景与动机2.核心贡献3.方法论细节4.实验结果与洞见5.总结 FairCLIP: Harnessing Fairness in Vision-Language Learning FairCLIP - 医疗视觉语言学习中的公平性提升 Accepted by CVPR2024 github:链接 1.研究背景与动机…

Linux 入门:权限的认识和学习

目录 一.shell命令以及运行原理 二.Linux权限的概念 1.Linux下两种用户 cannot open directory .: Permission denied 问题 2.Linux权限管理 1).是什么 2).为什么&#xff08;权限角色目标权限属性&#xff09; 3).文件访问者的分类&#xff08;角色&#xff09; 4).文…

大语言模型的压缩技术

尽管人们对越来越大的语言模型一直很感兴趣&#xff0c;但MistralAI 向我们表明&#xff0c;规模只是相对而言的&#xff0c;而对边缘计算日益增长的兴趣促使我们使用小型语言获得不错的结果。压缩技术提供了一种替代方法。在本文中&#xff0c;我将解释这些技术&#xff0c;并…

Java高频面试之集合-14

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;为什么 HashMap 的容量是 2 的倍数呢&#xff1f; HashMap的容量被设计为2的幂次&#xff0c;主要基于以下原因&#xff…

TreelabPLMSCM数字化供应链解决方案0608(61页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;TreelabPLMSCM 数字化供应链解决方案 0608 在当今快速变化的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;Treelab 数智化 PLM_SCM 行业解决方案应运而生。该方案聚焦市场趋势与行业现状&#xff0c;致力于解…

Docker搭建MySQL主从服务器

一、在主机上创建MySQL配置文件——my.cnf master服务器配置文件路径&#xff1a;/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服务器配置文件路径&#xff1a; /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服务配置文件内容 …

JS逆向案例-HIKVISION-视频监控的前端密码加密分析

免责声明 本文仅为技术研究与渗透测试思路分享,旨在帮助安全从业人员更好地理解相关技术原理和防御措施。任何个人或组织不得利用本文内容从事非法活动或攻击他人系统。 如果任何人因违反法律法规或不当使用本文内容而导致任何法律后果,本文作者概不负责。 请务必遵守法律…

SENT接口

文章目录 前言SENT接口简介物理层数据链路层编码方式帧结构消息格式短串行消息格式增强型串行消息格式 CRC校验和CRC4CRC6 错误检测机制 IP 设计结构框图接口设计上板验证 前言 本文参考标准《SAE J2716_201604》。 SENT接口 简介 SENT&#xff08;Single Edge Nibble Tran…

Qt-搭建开发环境

1.环境搭建 开发工具概述&#xff1a; Qt ⽀持多种开发⼯具&#xff0c;其中⽐较常⽤的开发⼯具有&#xff1a;Qt Creator、Visual Studio、Eclipse. 1.1Qt Creator Qt Creator 是⼀个轻量级的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使⽤ Qt 框架进…

Odoo18 Http鉴权+调用后端接口

最近在调研Odoo18&#xff0c;包括它的前后端原理、源码等。发现官方的开发文档并不十分实用&#xff0c;比如标题这种简单的实用需求&#xff0c;竟然浪费了一点时间&#xff0c;特此记录。 官方文档&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…