有这2个函数:
1.
#include <iostream>
int ReturnIntX(int x) {
if (x == 1) {
return x;
}
}
int main()
{
int a = 1;
int b = ReturnIntX(a);
}
#include <iostream>
int ReturnInt1(int x) {
if (x == 1) {
return 1;
}
}
int main()
{
int a = 1;
int b = ReturnInt1(a);
}
以前的启动/后台进程与此有什么关系吗?
我有兴趣知道什么会更快:返回传递的参数,还是文字值?毕竟,如果你想一想,变量x即使是空的,也可以有“权重”,如果它也有值,那么“权重”就会增加
PS:您能推荐一些用于自测试的库吗?
如果函数
ReturnIntX接收到一个以外的参数x,则该函数将终止且不返回值。C++语言认为这种情况是未定义的行为。编译器假定程序员不允许未定义的行为。也就是说,事实上,编译器假设x它总是被传递给一个值等于 1 的函数。然后您可以优化并从函数中返回一个并删除条件运算符。此外,函数调用也可以被删除,因为它的执行结果是预先知道的。这就是编译器所做的:代码中的所有函数调用都被替换为文字值 - 一。对于该函数的两个版本都是如此,并且使您的问题毫无意义:程序中没有该函数的代码,并且对其运行速度感兴趣是没有意义的。
PS函数的速度一般是任意的。您可以测量整个程序的速度,并根据该速度得出“函数速度”的结论。但“函数的速度”在另一个程序中可能会有所不同。可靠地确定“函数的速度”需要大量的经验。
现代编译器不再逐行编译代码。编译器的工作是找到与源代码行为相同的最有效的代码。
由于在您的情况下(除了 UB 之外)两个片段的含义是相同的,因此它将以相同的方式编译。具体如何取决于具体的编译器以及目标平台。
例如,对于 Intel 平台,clang 生成了相同的代码:https://godbolt.org/z/EPKqxKP75:
编译器通常有权随意更改您的代码,只要结果相同(减去 UB)。例如,在这里,他将循环分解为普通的乘法。
如果你想优化你的代码,那么你不应该担心这种纳米优化;编译器可以比你做得更好。优化您使用的算法和数据结构。
如果将抽象的猫头鹰拉伸到虚拟地球上,则无法回答这个问题。
例如,在这种特殊情况下,
return 1;由于未定义的行为,该函数将是等效的,并且也许在替换后它将完全从代码中消失,只有一个单元将被写入寄存器中的某处。从理论上讲,这一切都取决于如何从您的文字值(文字?)获取最终对象,以及它比复制“更昂贵”,以及替换的可能性有多大。如果有更正的代码。
然而,不可能提前说 RVO 比复制快多少。 我们只能保证 NRVO 不适用于函数参数, 因此在非保守上下文中,非引用参数将始终被复制而不是就地创建。
其余的只能通过性能测量或读取编译器针对特定情况生成的代码来判断。