哪种返回值的方法在C++中效果更快?

  • 本文关键字:C++ 返回值 方法 c++ c++11
  • 更新时间 :
  • 英文 :


假设某个函数有多个if状态,就像下面的代码一样。 这两种返回默认值的方式有什么区别吗?谁能告诉我这两种方法的缺点?

第一:

CustomClass foo(const Param* par)
{
    if (nullptr == par)
        return CustomClass();
    if (!check1(par))
        return CustomClass();
    if (!check2(par))
        return CustomClass();
    // some code
    return CustomClass();
}

第二:

CustomClass foo(const Param* par)
{
    CustomClass ret;
    if (nullptr == par)
        return ret;
    if (!check1(par))
        return ret;
    if (!check2(par))
        return ret;
    // some code
    return ret;
}

似乎应该取决于共枕...

两者都是编译器优化的主题。第一个是 URVO(未命名的返回值优化(,第二个是 NRVO(命名的返回值优化(。C++标准明确允许编译器逃避复制。

[12.8]

当满足某些条件时,允许实现 省略类对象的复制/移动构造,即使 为复制/移动操作和/或析构函数选择的构造函数 对于对象有副作用。

。在具有类返回类型的函数的 return 语句中,当表达式是非易失性自动对象的名称时 (函数参数除外...(具有相同的类型(忽略 cv-qualing(作为函数返回类型,复制/移动操作 可以通过将自动对象直接构造到 函数调用的返回对象

GCC、Clang 和 MSVC 的现代版本即使在没有启用优化的情况下,也会在这两种情况下产生相等的组装。以下是一些示例:

  • 乌尔沃
  • NRVO

任何明智的编译器都应该为这两个函数生成相同的代码,因为它们的含义完全相同,并且优化器可以相对容易地推断出这一事实。

请记住,您的源代码不是 CPU 指令的一对一映射:它是程序的描述。编译器的工作是采用此描述并生成执行相同功能的最佳"实际"代码,而编译器非常擅长这样做!我的观点是,无论如何,实际编译的代码看起来几乎都不像任何一个函数。

但是,最终,在您的特定平台上并使用您的特定实现是否真的如此,只能通过实际检查生成的汇编代码来确定。如果您只关心性能,则可以在基准测试中划清界限。

最新更新