【问题标题】:Are inline operators good?内联运算符好吗?
【发布时间】:2012-12-22 23:48:59
【问题描述】:

在 C++ 中进行内联的运算符和其他方法有什么区别吗? 我已经搜索过了,但正如我所见,这不是一个常见的问题。 有没有人有充分的理由使用或避免使用它? 注意:很明显,我指的是小的内联运算符。

【问题讨论】:

  • 好吧,内联不取决于您,而是取决于编译器,除非您使用特定于编译器的东西。所以C++的答案是:没关系,不能控制。
  • @GManNickG:这应该是一个答案而不是评论!
  • @K-ballo:嗯,这将需要努力解释inline 关键字实际上如何控制内联,嗯,我已经变得懒惰了。 :)
  • 我能想象的唯一强有力的理由是内联代码会严重影响可读性(取决于必要的代码量)。运算符可能会出现成束。
  • 另见this SO question

标签: c++ operators inline-method


【解决方案1】:

虽然这可能因编译器而异,但我希望从编译器的角度来看,运算符只是另一个名称有点不寻常的函数,它可以让源代码的语法看起来有点不同。

尽管如此,当编译器的代码生成器部分运行时,我预计重载运算符和另一个函数(执行相同操作)之间的任何差异都会消失。

因此,将其声明为inline 或在类定义的主体中定义它与任何其他函数一样具有(很少,取决于您的观点)运算符重载。我通常希望在这两种情况下这种影响都非常小——至少在启用优化时,大多数编译器几乎都会忽略 inline 关键字,并自行决定在什么上扩展内联(以及不扩展什么)他们自己的。

请注意,编译器不能忽略 inline 关键字的一种方式 - 必须遵守对“单一定义规则”的一些​​特殊修改,无论函数是否实际内联扩展.

【讨论】:

  • 运算符重载只是另一个函数,没有区别
  • @K-ballo:从标准的角度来看,您显然是对的。从编译器的角度来看,我期望它也是正确的——但是编译器可以根据某事是否是运算符重载应用不同的内联规则(尽管我在实践中看到它会感到惊讶)。
  • 编译器也可以根据任何其他条件应用不同的内联规则,例如函数接受的参数数量,或者它的名称是否与特定模式匹配。重载的运算符在这方面没什么特别的。
【解决方案2】:

您可以使用inline 关键字建议编译器将函数设为内联。

编译器没有义务服从这个要求。

运算符是相似的——它们可能是内联的,也可能不是内联的。

由于不能强制编译器内联,因此可能没有充分的理由使用或避免使用内联提示。因为它们就是:提示。

在 Visual C++ 中,您可以使用 __forceinline 关键字强制内联,结果是代码更大并可能降低性能。在精心设计的系统中,消除选项(通过强制执行)通常会导致性能下降,这是很常见的。即使使用这个关键字,也不是每个函数都能成功内联。

讨论 GCC 内联 here

【讨论】:

【解决方案3】:

正如其他人提到的,编译器是否“内联”方法通常不是代表您,关于 inline 关键字的使用和编译器的优化策略。

所以我认为更重要的方面是头文件的可读性,operator 方法很可能会以例如集合的形式出现。算术运算实现,可以使用简单的转换来构建它们。因此,如果我必须查看此类头文件,我希望将逻辑相关的运算符方法签名集一起查看,以大致了解哪些适用或不适用。

一个很简单的例子是operator==()operator!=()的实现:

class A
{
public:

    // Equality tests
    //-----------------------------------------------------------------------

    // This may involve some mor complex code that'll look ugly here
    bool operator==(const A& rhs) const;

    // Fine, this is a one liner. Code appears 'inline' (and is likely to be 
    // chosen for inlining by the compiler, no matter if inline keyword or not)
    bool operator!=(const A& rhs) const { return !A::operator==(rhs); }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多