【问题标题】:Is it good idea to write multi level inline functions in C++?用 C++ 编写多级内联函数是个好主意吗?
【发布时间】:2017-06-08 21:28:31
【问题描述】:

这样的代码是否被认为是一种不好的做法? 如果是这样,当func1 重复func2 的行为并且我需要同时存在这两个函数时我该怎么办(这不是认为代码冗余)吗?!

UPD:对不起,我的插图不好,我会尝试更清楚地解释这个问题。 我想问的是: 我正在尝试设计一个优化的类,它大量调用两个方法func1func2func1 的实现使用func2,我希望这两个方法调用尽可能内联,是这样吗最好像这段代码一样从func1 调用func2,或者单独实现两者。

inline int func2(int x) {
    return x * (x + 2);
}
inline int func1(int x) {
    return x * (x + 1) * func2(x + 2);
}

【问题讨论】:

  • 您是在问一个内联函数调用另一个内联函数是否是个坏主意?为什么你会认为这是一个坏主意?
  • 如果你需要两个函数,那么根据定义,这不是多余的。如果它们是多余的,则不需要两个函数。
  • 这个问题有很多问题,我什至不知道从哪里开始。 1)您的标题提到了内联函数。 inline 函数在哪里? 2)“需要同时存在这两个功能”。等等? 3)你提到func1()复制func2。副本在哪里?
  • 抱歉我的插图不好,我更新了帖子。希望问题现在很清楚

标签: c++ optimization inline-functions


【解决方案1】:

如果避免多次编写相同的代码,编写几个小函数是可以的。有些人可能会争辩说,太多的小函数会使代码难以阅读,这是一个见仁见智的问题。

如果您担心性能,编译器会在认为有帮助的情况下进行内联,在您证明存在问题之前,您不必担心。有关过早优化,请参阅 this question

【讨论】:

    【解决方案2】:

    一个函数调用另一个函数没有问题。如果您对它们进行采样,您会发现实际程序比 2 次调用更深入。

    就内联而言,这也没有问题。优化编译器通常会内联func2(假设它的定义是可见的并且启用了优化)。许多常见的编译器和优化器都擅长内联。他们通常知道何时内联,何时不内联——这一切都无需您的帮助。

    编写小函数并不是一个坏习惯。清晰度和意图通常比微优化更重要。在典型情况下,您的示例没有任何问题。

    【讨论】:

      【解决方案3】:

      如果它有助于您的代码的可读性,那么是的。您几乎应该始终以代码的可读性为目标。不要忘记正确命名您的函数,以便其他人很容易理解该函数在做什么。我指的是其他人,几周或几个月后你也一样。正如他们所说,您编写代码一次,但多次阅读。
      至于性能,现代编译器知道何时内联函数,您不必担心。在真正重要的情况下,您只需使用分析器来查找主机点并最终更改它。但它发生的次数比你想象的要少得多。您几乎总能找到更好的方法来优化您的代码。

      【讨论】:

        【解决方案4】:

        如果两者都在相同的范围内实现,那么编译甚至可以在没有inline 的情况下进行一些代数优化。前段时间,当看到编译器有时用简单的目标函数调用(有点为 d3d api 携带的参数)替换大而复杂的结构时,我感到非常惊讶。因此,如果您担心性能,那就不要……至少您的应用基准测试非常糟糕。

        另一方面,这都是关于关系的:如果 func1 与 func2 没有真正的逻辑相关,那么只有代码\数学有点相同,而不是将 func2 复制到 func1 中。为什么?因为 func2 可能会被更改,但你忘记了 func1 并破坏了它,因为它们与内部域逻辑无关。


        UPD 之后的 UPD

        如果所有关于速度和它们只是数学,那么在 func1 中编写完全优化的表达式并且不依赖编译器。但前提是你真的知道性能是第一位的。

        【讨论】:

          猜你喜欢
          • 2011-12-12
          • 2017-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 2014-08-15
          • 1970-01-01
          相关资源
          最近更新 更多