C++函数重载与编译链接

前言

        C++支持函数重载,C语言不支持函数重载,它们的区别在于编译器对函数编译的实现不一样。

编译链接

        要想明白这个问题,我们首先来简单认识一下编译链接。我们平时写的C,C++代码都是需要通过编译链接生成可执行文件的。

        为什么需要编译链接?因为我们写的代码CPU是不能直接识别到的,需要通过编译把我们写的代码转换成汇编语言,汇编语言再转换成二进制的机器语言,然后把项目中的多个二进制文件链接起来生成可执行程序。

        下面我们来更详细的了解一下编译链接的具体过程。

编译阶段

        编译阶段分为预处理,编译,汇编三个阶段。

预处理

        编译阶段首先要做的一件事是预编译。预处理,就是在为编译阶段做铺垫。要做的工作有:头文件展开、宏替换、条件编译、去掉注释等等。

        头文件展开就是在源文件中把包含的相应头文件拷贝到源文件中,头文件由于以及包含到源文件中了所以不会参加编译以及后续的阶段。

         条件编译是指的是我们在编译的时候可以根据某些条件选择是否编译某一段代码。

编译

        预处理完成之后要进行编译,编译主要是检查语法正确性并转换为汇编代码。

汇编

        汇编阶段把汇编代码转换为机器语言,并生成符号表。符号表主要是在链接的时候发挥作用, 在很多时候函数声明和定义是分离的是在2个不同的文件中,这时候符号表中就有声明和定义的映射关系,供在链接阶段编译器去查找。

链接阶段

        把编译阶段完成后的二进制文件链接起来生成一个可执行程序。

C++编译器函数名修饰规则

        C语言的编译器在汇编代码中定义一个函数的时候直接是使用它的函数名。但是在C++中汇编代码定义一个函数的时候是根据函数名修饰规则去定义的。

        下面是在Linux环境下使用gcc、g++作为编译器实现的样例。Linux下编译后生成a.out可执行文件。objdump可以查看对应的汇编代码。

C语言汇编

[root@VM-0-13-opencloudos ~]# vim test.c
#include <stdio.h>void Function(int a)
{printf("%d\n", a);
}int main()
{int a = 10;Function(a);return 0;
}
[root@VM-0-13-opencloudos ~]# gcc test.c
[root@VM-0-13-opencloudos ~]# objdump -S a.out
....
0000000000400596 <Function>:400596:       55                      push   %rbp400597:       48 89 e5                mov    %rsp,%rbp40059a:       48 83 ec 10             sub    $0x10,%rsp40059e:       89 7d fc                mov    %edi,-0x4(%rbp)4005a1:       8b 45 fc                mov    -0x4(%rbp),%eax4005a4:       89 c6                   mov    %eax,%esi4005a6:       bf 78 06 40 00          mov    $0x400678,%edi4005ab:       b8 00 00 00 00          mov    $0x0,%eax4005b0:       e8 eb fe ff ff          callq  4004a0 <printf@plt>4005b5:       90                      nop4005b6:       c9                      leaveq4005b7:       c3                      retq
....

C++汇编

[root@VM-0-13-opencloudos ~]# vim test.cpp
#include <stdio.h>void Function(int a)
{printf("%d\n", a);
}void Function(int a, double b)
{printf("%d %f\n", a, b);
}int main()
{int a = 10;int b = 10.1;Function(a);Function(a, b);return 0;
}
[root@VM-0-13-opencloudos ~]# g++ test.cpp
[root@VM-0-13-opencloudos ~]# objdump -S a.out
00000000004005b6 <_Z8Functioni>:4005b6:       55                      push   %rbp4005b7:       48 89 e5                mov    %rsp,%rbp4005ba:       48 83 ec 10             sub    $0x10,%rsp4005be:       89 7d fc                mov    %edi,-0x4(%rbp)4005c1:       8b 45 fc                mov    -0x4(%rbp),%eax4005c4:       89 c6                   mov    %eax,%esi4005c6:       bf d8 06 40 00          mov    $0x4006d8,%edi4005cb:       b8 00 00 00 00          mov    $0x0,%eax4005d0:       e8 eb fe ff ff          callq  4004c0 <printf@plt>4005d5:       90                      nop4005d6:       c9                      leaveq4005d7:       c3                      retq00000000004005d8 <_Z8Functionid>:4005d8:       55                      push   %rbp4005d9:       48 89 e5                mov    %rsp,%rbp4005dc:       48 83 ec 10             sub    $0x10,%rsp4005e0:       89 7d fc                mov    %edi,-0x4(%rbp)4005e3:       f2 0f 11 45 f0          movsd  %xmm0,-0x10(%rbp)4005e8:       f2 0f 10 45 f0          movsd  -0x10(%rbp),%xmm04005ed:       8b 45 fc                mov    -0x4(%rbp),%eax4005f0:       89 c6                   mov    %eax,%esi4005f2:       bf dc 06 40 00          mov    $0x4006dc,%edi4005f7:       b8 01 00 00 00          mov    $0x1,%eax4005fc:       e8 bf fe ff ff          callq  4004c0 <printf@plt>400601:       90                      nop400602:       c9                      leaveq400603:       c3                      retq

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

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

相关文章

PNPM 批量检查和更新项目依赖

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

LPC/LSP/LSF辨析

我们在阅读语音或者数字信号处理的论文书籍时经常会遇到LPC,LSF和LSP这些和线性预测相关的名词,刚接触时容易一头雾水,今天我们就介绍下它们之间的关系。 LPC/LSP/LSF 线性预测编码(Linear Predictive coding ,LPC),是一种用于语音信号压缩和分析的方法。在LPC模型中,…

18个惊艳的可视化大屏(第三辑),各行业都有。

2023-04-28 22:35贝格前端工场 本次分享第二辑&#xff0c;请大家慢慢欣赏。

Swift基础知识:18.Swift类

在 Swift 中&#xff0c;类&#xff08;Class&#xff09;是一种用来创建具有共同属性和方法的对象的蓝图。与结构体&#xff08;Structures&#xff09;不同&#xff0c;类是引用类型&#xff0c;它在传递和赋值时是共享同一份数据。类具有面向对象编程的特性&#xff0c;包括…

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…

041-WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

041-WEB攻防-ASP应用&HTTP.SYS&短文件&文件解析&Access注入&数据库泄漏 #知识点&#xff1a; 1、ASP-SQL注入-Access数据库 2、ASP-默认安装-数据库泄漏下载 3、ASP-IIS-CVE&短文件&解析&写入 演示案例&#xff1a; ➢ASP-默认安装-MDB数据库泄…

如何压缩pdf文件大小?3个有效的解决方法分享

如何压缩pdf文件大小&#xff1f;在办公中&#xff0c;PDF文件大小的压缩不仅有助于节省存储空间&#xff0c;使得大量的PDF文件可以更为高效地存储在有限的硬盘或云端空间中&#xff0c;还能显著加快文件在网络中的传输速度&#xff0c;特别是在处理大型或批量PDF文件时&#…

EXCEL使用VBA一键批量转换成PDF

EXCEL使用VBA一键批量转换成PDF 上图是给定转换路径 Sub 按钮1_Click() Dim a(1 To 1000) As String Dim a2 As String Dim myfile As String Dim wb As Workbook a2 Trim(Range("a2"))myfile Dir(a2 & "\" & "*.xls")k 0Do While m…

springcloud-网关(gateway)

springcloud-网关(gateway) 概述 \Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API&#xff0c;并为其提供跨领域的关注&#xff0c;如&#xff1a;安全、监控/指标和容错 常用术语 Route&#xff08;路由&#xff09;: 网关的基本构件。它由一个ID、一个目的地…

Lightfm学习记录

推荐参考资料 官方文档仓库地址论文地址LightFM推荐系统框架学习笔记LightFM推荐模型库(利于入门)how-i-would-explain-building-lightfm-hybrid-recommenders-to-a-5-year-old(用处不大)协同推荐 lightfm 根据用户已读诗词推荐(可能有用)Recommendation System in Python: L…

C#开发AGV地图编辑软件

C#自己开发AGV地图编辑软件&#xff1a; 1、自由添加和删除站点、停车位、小车、运行路径。 2、编辑得地图以XML文件保存。 3、导入编辑好地图的XML文件。 4、程序都是源码&#xff0c;可以直接在此基础上进行二次开发。 下载链接&#xff1a;https://download.csdn.net/d…

隐匿的炸弹 — C语言的隐式声明

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学 在图像处理领域中&#xff0c;轮廓检测是一项重要的任务&#xff0c;用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测&#xff0c;并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 1. 引言 图像轮廓检测是图…

JAVA学习-操作符.逻辑操作符

逻辑操作符用于在条件语句中进行逻辑判断&#xff0c;常用于控制程序的流程。 一、Java中的逻辑操作符有以下几种&#xff1a; 1. 逻辑与&#xff08;&&&#xff09;&#xff1a; 当且仅当两个操作数都为true时&#xff0c;返回true&#xff1b;否则返回false。 bo…

基于PSO优化的CNN多输入时序回归预测(Matlab)粒子群算法优化卷积神经网络时序回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

PHP分析二维数据表(长度|数字字段|空值|纯姓名|英文用户名|科学计数|是否等长|是否唯一)

先看图&#xff0c;后有完整代码 <?php $t "Excel数据转Sql查询系统字段半智能分析"; $s "Excel复制过来的二维结构表内容,分析查询条件&#xff01;"; $x "字段|最大长度|长度有|数字字段|空值存在|纯姓名|英文用户名|科学计数|是否等长|是否…

无痛法门,助力学习

**注&#xff1a;**本文摘自一位网友“我就是贺生啊”&#xff0c;博主觉得很有道理&#xff0c;便想记录下来分享给大家。仅个人想法&#xff0c;谨慎参考&#xff0c;也欢迎大家说出自己的想法。 引言 在我们学习新知识的时候&#xff0c;会觉得很痛苦&#xff0c;制定学习…

【git】提交信息写错了,使用 amend 或者 reset 修改最近一次的提交信息 ,修改上上次/以前的提交信息

如果你的提交信息写错了&#xff0c;比如下面&#xff0c;你想修改【初始化项目】这5个字 修改最近一次的提交新的两个办法 &#xff08;1&#xff09;使用 reset 把这个提交重置&#xff0c;然后重新提交&#xff0c;reset 的使用方法请参考这篇文章。但是 reset 这种方法只能…

Django学习笔记-HTML实现MySQL的图片上传

1.django项目编写index.html代码 创建form表单,路由指向upload,请求方式post,enctype设置"multipart/form-data", post请求添加{% csrf_token %},编写两个input,上传和提交 2.添加upload路由 3.views中创建upload 1).获取上传的文件,没有上传则返回"没有指定…

2024年度最高人气的编程语言

本期共享的是 —— 年度地球人气最高的编程语言。 根据我们对人力资源专家和开发者的年度调查&#xff0c;目前市场需求量最大的 10 种编程技术是&#xff1a; Python&#xff08;42.1% 的受访者对具备该技能的候选人有大量需求&#xff09;JS&#xff08;41.6%&#xff09;Ja…