首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中,函数重载通常是如何实现的?

在C++中,函数重载通常是如何实现的?
EN

Stack Overflow用户
提问于 2010-02-09 15:46:51
回答 5查看 8.5K关注 0票数 17

如果没有函数重载,则函数名作为函数代码的地址,并且在调用函数时,很容易使用其名称找到其地址。然而,对于函数重载,程序如何准确地找到正确的函数地址?是否有一个类似于虚拟表的隐藏表来存储重载函数及其地址?非常感谢!

EN

回答 5

Stack Overflow用户

发布于 2010-02-09 15:55:55

Name mangling

这一切都是在编译时完成的。C++编译器实际上修改了您在内部提供的函数名,以便像这样的函数

int foo(int a, float b, char c) 

在内部获取一个等同于

func_foo_int_float_char()

(真正的符号通常是像?CFoo@Foo@@QAAX_N@Z这样的官样文章)。

正如您所看到的,根据传递的参数的确切数量和类型来修饰名称。因此,当您调用一个函数时,编译器可以很容易地查看您传递的参数,用它们修饰函数名,并得出正确的符号。例如,

int a, b; float f; char c;
foo(a,f,c) ; // compiler looks for an internal symbol called func_foo_int_float_char
foo(a,b,c) ; // compiler looks for a symbol called func_foo_int_int_char

同样,这一切都是在编译时完成的。

票数 13
EN

Stack Overflow用户

发布于 2010-02-09 15:49:25

重载函数是在编译时解析的。编译器为给定的一组参数找到合适的匹配项,并根据其地址简单地调用相应的函数(void foo(int)void foo()实际上是两个完全独立的函数-如果您的代码中有foo(4),编译器就知道要调用哪个函数)。

票数 3
EN

Stack Overflow用户

发布于 2010-02-09 15:49:15

我相信,这是通过名称篡改实现的:

您所知道的foo(整型)和foo(双精度型)函数实际上被命名为类似于int_foo()和double_foo() (或者类似的,我不完全确定用于C++的特定语义)。这意味着C++符号通常比代码中给出的名称大一个数量级。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2227516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档