1
函数重载的实现机制
函数重载:在相同作用域中的多个函数,具有相同的名字而形参表不同。
不能仅仅基于不同的返回类型而实现函数重载。返回值是不影响函数重名的。
C++函数重载底层实现原理是C++利用name mangling(倾轧)技术
,来改名函数名,区分参数不同的同名函数。
编译器通过函数名和其参数类型识别重载函数。为了保证类型安全的连接(type-safe linkage),编译器用参数个数和参数类型对每一个函数标识符进行专门编码,这个过程有时称为“名字改编”(name mangling)或“名字修饰”(name decoration)。类型安全的连接使得程序能够调用合适的重载函数并保证了参数传递的一致性。编译器能够检测到并报告连接错误。
objdump -t查看符号表
gcc编译
test.c
int func(int a){};
编译
gcc -c test.c -o test.o
查看符号
objdump -t test.o
函数名 名字改编
int func(int a); func
g++编译
test.cpp
int func(int a){};
int func(int a,int b){};
编译
gcc -c test.c -o test.o
查看符号
objdump -t test.o
函数名 名字改编
int func(int a); _Z4funci
int func(int a,int b); _Z4funcii
_Z是规定前缀,4是函数名的字符个数,i是参数列表的首字母