C++函数重载的实现原理

对于c++来说,多个函数可以同名,但是这些函数的参数类型必须不一样,也就是说c++中相同的函数名函数参数不同代表了不同的函数,当你去调用这些函数时,编译器可以根据你的传入参数的类型去判断你调用的是哪个函数。但是c++编译器是怎么实现的呢?

先看看c对于函数的处理:


执行命令:gcc -S main_c.c -o main_c.s 得到如下内容


可以看到c编译器那你的函数转成汇编指令,定义你的函数名字的时候用的是语言来的函数名(当然前面加了一个下划线)

在看一段c++代码

执行命令 g++ -S main_cpp.cpp -o main_cpp.s 得到
函数定义代码

调用代码

可以看到dguco_add(int ,int ) 变成了__Z9dguco_addii 另外一个变成__Z9dguco_addff,很明显ii代表两个参数是int类型,ff代表函数两个参数,参数是float类型,通过看汇编代码,我们可以看到c++编译器对重载函数做了什么处理,她为每个函数转成了不同的汇编实现,对于c语言来说这就是两个函数。

由此我们看到,c++把重载函数的名字和参数类型结合在汇编曾给每个函数实现了自己的汇编实现,这样每次去调用这个函数是,c++编译器久根据参数类型去调用相应的函数。

这也是我们有时候在c++调用一些外部的c库或者是引用一些c语言的头文件时,要用extern “C”,这个关键字可以让编译器改变编译器对于这些函数的处理,让编译器在寻找这些函数对应的目标代码时寻找c编译器遍以后对应得函数块,而不是c++的,否则就会出现找不到该函数的错误。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值