c++ 的overload实现

 

引入

c++ 相比c有一个新特性就是overload 又名函数重载,是c++静态多态或者编译多态的实现

但是c不行,

c 语言中的函数名处理

c程序在汇编过程中,编译器会收集全局符号并生成全局符号表

符号表即,讲符合与其地址一一对应的表哥称为符号表,

在汇编的过程中我们生成了多个符号表,但最后我们只能有一个符号表,所以在链接过程中要对符号表进行合并。在合并的过程中发现同一个函数出现了两次

C++的名字修饰(name mangling/name decoration)

C++如何支持函数重载呢?

编译器会根据函数名和参数类型生成修饰后的函数名,每个重载函数都具有唯一的修饰名称。例如:

例如:

int add(int a, int b){return a+b;}
double add(double a, double b){return a + b;}

编译后成为(反汇编可以看到):

00000000000008da <_Z3addii>:
00000000000008ee <_Z3adddd>:

这里 _Z 表示函数名被修饰,后面跟原名称和参数类型编码。所以每个函数都获得了唯一标识,重载实现了。

extern “C”的情况

值得注意的是,当C++代码被放在extern “C”块内时,编译器会确保函数名不被修饰,保持与C语言兼容

参考文档

https://en.wikipedia.org/wiki/Name_mangling