gpt4 book ai didi

c++ - 定义多个名称相同但类型不同的函数对 C++ 编译器的性能有何影响?

转载 作者:行者123 更新时间:2023-11-30 02:31:32 25 4
gpt4 key购买 nike

我在 Stroustrup 的“C++ 之旅”(2014 年)中看到了这个示例。如果您定义具有完全相同名称但参数类型不同的函数,编译器将为每次调用选择最合适的函数:

void print(int);      // takes an integer argument
void print(double); // takes a floating-point argument
void print(string); // takes a string argument

void user()
{
print(42); // calls print(int)
print(9.65); // calls print(double)
print("D is for digital"); // calls print(string)
}

(1) 像这样用相同的名称命名函数不会导致(可能是轻微的)性能损失吗?

(2) 给定输入,编译器究竟如何“选择”最合适的函数?这里的幕后发生了什么?

最佳答案

函数重载(至少通常如此)对执行速度没有影响。考虑一下您是否将这些函数编写为:

void print_int(int);         // takes an integer argument
void print_double(double); // takes a floating-point argument
void print_string(string); // takes a string argument

...然后根据您要打印的内容选择其中一个打印出来。这几乎就是编译器所做的:它获取参数的数量和类型,并将它们编码成一个“损坏的”名称。当您进行函数调用时,编译器(在编译时)查看可用的函数,选择一个,然后创建对该函数的调用。调用该函数的代码与调用未重载函数的代码相同。

委婉地说,选择最佳功能是一项非常重要的工作。它分几个阶段进行。第一个是找到一个作用域,在该作用域中某物 是用您使用的名称定义的。第二种是查看该范围内具有该名称的所有内容,以创建一个重载列表。

下一步是消除根本无法工作的重载——例如,根本无法接受您传递的参数数量的重载。如果只剩下一个函数,重载解析就完成了。如果不止一个,我们将进入重载决议的最后(也是最棘手的)部分。

编译器从每种类型的可能隐式转换列表和每种类型的排名开始。 “最佳”是身份转换(即,根本不进行任何转换,例如如果您传递的是 int 而函数需要 int)。稍微差一点(但仍然相当不错)的是添加一个 const。最终,您会遇到诸如将 double 截断为 int 之类的事情。

然后,编译器一次一个地检查参数,并查看从该参数到形式参数类型所需的转换。要成为“最佳”重载并被选中使用,至少有一个参数必须具有比任何其他重载的转换“更好”的转换,并且任何参数都不能具有更差 比任何其他重载所需的重载都要多。

如果没有这样的事情(例如,您只有两个可行的函数,并且每个函数都有一个转换更好的参数和一个转换更差的参数)调用是不明确的,因此代码无法编译.

关于c++ - 定义多个名称相同但类型不同的函数对 C++ 编译器的性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com