- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!