【问题标题】:Branches in Inline Functions内联函数中的分支
【发布时间】:2015-10-16 07:34:10
【问题描述】:

我认为我对编译器有严重的不信任。如果内联函数内部的分支具有恒定的结果,它们会被优化掉吗?

对于示例函数:

#define MODE_FROM_X_TO_Y 0
#define MODE_FROM_Y_TO_X 1

inline void swapValues(int & x, int & y, int mode) {
    switch(mode) {
        case MODE_FROM_X_TO_Y:
            y = x;
            break;
        case MODE_FROM_Y_TO_X:
            x = y;
            break;
    }
}

会:

swapValues(n,m,MODE_FROM_X_TO_Y);

优化为:

n = m;

【问题讨论】:

  • 这将取决于您使用的实际编译器,但通常答案是“是”和“否”。
  • 您可以做的一个简单测试是在发布版本中编译您的代码,并尝试在您认为编译器正在优化的代码行中放置一个断点,如果您不能在那里放置一个断点您可以查看错误,有时(并非总是)编译器会说它无法达到该断点,因为正在优化代码。但这并不总是有效,唯一知道的方法是去大会
  • 刚刚用 clang 和 -O3 测试过这个:是的,它已经完全优化了。

标签: c++ visual-c++ inline compiler-optimization


【解决方案1】:

首先,它甚至不会编译(直到您添加返回类型)。

其次,swap 是一个非常糟糕的名称(因为它没有 swap,并且与 std::swap 名称冲突)。

第三,前往http://gcc.godbolt.org/

Live On Godbolt

【讨论】:

  • 这是一个很棒的网站,感谢您的链接。另外,我只是在示例函数方面做得很快。我现在就解决这个问题。
【解决方案2】:

一般来说,这些问题的答案取决于编译器。

要使用您的代码、编译器(和编译器版本)和编译器设置(例如优化标志)来回答您的问题,您需要检查编译器输出的代码。

如果编译器可以检测到始终遵循相同的分支,则任何代码中的分支(不仅仅是内联函数中的分支)都可能被“优化”。

一些现代编译器也足够聪明,如果它评估另一个函数作为内联的更好候选者,它不会内联声明为inline 的函数。与典型的 C/C++ 程序员相比,许多现代编译器可以更好地做出此类决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2023-03-10
    • 2011-03-07
    • 2019-03-24
    相关资源
    最近更新 更多