RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1580857
Accepted
Denis
Denis
Asked:2024-05-20 00:48:44 +0000 UTC2024-05-20 00:48:44 +0000 UTC 2024-05-20 00:48:44 +0000 UTC

这 2 个函数中哪一个的执行速度更快,为什么?

  • 772

有这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:您能推荐一些用于自测试的库吗?

c++
  • 3 3 个回答
  • 122 Views

3 个回答

  • Voted
  1. Best Answer
    Stanislav Volodarskiy
    2024-05-20T02:39:45Z2024-05-20T02:39:45Z

    如果函数ReturnIntX接收到一个以外的参数x,则该函数将终止且不返回值。C++语言认为这种情况是未定义的行为。编译器假定程序员不允许未定义的行为。也就是说,事实上,编译器假设x它总是被传递给一个值等于 1 的函数。然后您可以优化并从函数中返回一个并删除条件运算符。此外,函数调用也可以被删除,因为它的执行结果是预先知道的。这就是编译器所做的:代码中的所有函数调用都被替换为文字值 - 一。

    对于该函数的两个版本都是如此,并且使您的问题毫无意义:程序中没有该函数的代码,并且对其运行速度感兴趣是没有意义的。

    PS函数的速度一般是任意的。您可以测量整个程序的速度,并根据该速度得出“函数速度”的结论。但“函数的速度”在另一个程序中可能会有所不同。可靠地确定“函数的速度”需要大量的经验。

    • 11
  2. VladD
    2024-05-20T03:54:46Z2024-05-20T03:54:46Z

    现代编译器不再逐行编译代码。编译器的工作是找到与源代码行为相同的最有效的代码。

    由于在您的情况下(除了 UB 之外)两个片段的含义是相同的,因此它将以相同的方式编译。具体如何取决于具体的编译器以及目标平台。

    例如,对于 Intel 平台,clang 生成了相同的代码:https://godbolt.org/z/EPKqxKP75:

    mov     eax, 1
    cmp     edi, 1
    je      .EXIT
    

    编译器通常有权随意更改您的代码,只要结果相同(减去 UB)。例如,在这里,他将循环分解为普通的乘法。


    如果你想优化你的代码,那么你不应该担心这种纳米优化;编译器可以比你做得更好。优化您使用的算法和数据结构。

    • 5
  3. Swift - Friday Pie
    2024-05-20T17:28:22Z2024-05-20T17:28:22Z

    如果将抽象的猫头鹰拉伸到虚拟地球上,则无法回答这个问题。

    例如,在这种特殊情况下,return 1;由于未定义的行为,该函数将是等效的,并且也许在替换后它将完全从代码中消失,只有一个单元将被写入寄存器中的某处。

    从理论上讲,这一切都取决于如何从您的文字值(文字?)获取最终对象,以及它比复制“更昂贵”,以及替换的可能性有多大。如果有更正的代码。

    然而,不可能提前说 RVO 比复制快多少。 我们只能保证 NRVO 不适用于函数参数, 因此在非保守上下文中,非引用参数将始终被复制而不是就地创建。

    其余的只能通过性能测量或读取编译器针对特定情况生成的代码来判断。

    • 1

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5