C++函数重载实现原理浅析

---------------------------------------------------献给所有和我一样还没拿到office的同学-----------------------------------------------------------------------------------
                                    

                                                           C++函数重载实现原理浅析

 

       C++实现函数重载的技术手段是函数符号改名,所以我们可以通过分析编译器的函数符号改名机制来验证C++函数重载规则。



 

1.函数重载的概念

          函数重载: 出现在相同作用域中的多个函数,具有相同的名字而形参表不同。
  注意:不能仅仅基于不同的返回类型而实现函数重载。返回值是不影响函数签名的。




2.函数调用:

          函数调用时会发生什么?学过8086汇编时,我们都知道函数调用是程序执行点跳转到一个符号所在的地方转而执行符号所在地址的代码,然后再跳回去。这个符号就是函数。
    我们用一个简单的例子来说明一下函数调用
//在这个简单的实例中,我们只是简单的在main函数中调用了一下printhello函数来打印hello world!
#include <stdio.h>
void printhello()
{        
   printf("hello world!\n");
}

int main()
{
        printhello();//这里调用函数printhello
        return 0;
}
//函数调用部分对应的汇编代码为:
      main:.LFB1:
        .cfi_startproc
        pushq        %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq        %rsp, %rbp
        .cfi_def_cfa_register 6
        movl        $0, %eax
        call        printhello            ;这里call  printhello,跳转到符号printhello出执行      

        movl        $0, %eax
        popq        %rbp
        .cfi_def_cfa 7, 8
C语言中函数符号名和对应的函数名是一样的,而C++为了支持函数重载,符号名是在对应的函数名上改编的。如下图所示,函数名为func,而对应的符号名为_Z4funcv。

    C  函数名和符号名是不一样的.png 



 

3. C++的函数符号命名规则

          在前面的的图示中,我们给出了C++函数编译符号实例,貌似函数名是对应符号的子串额。实际上函数的编译符号是根据函数名,函数的参数表(包括参数类型和数量)相关的。而且不同的编译器的命名规则不一样。只要能保证相同的函数名和不同的函数参数列表生成的符号名不一样就行。下面我们来感受一下GCC的C++编译器的命名规则。

3.1函数返回类型不影响生成的符号名

    前面我们说不能仅仅基于不同的返回类型而实现函数重载,原因是函数返回值并不影响最后生成的符号。我现在就验证一下:
<
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值