内联函数中的分支

时间:2015-07-25 20:13:25

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

我认为我有严重的编译器不信任。如果内联函数中的分支具有恒定的结果,它们是否会被优化出来?

对于示例函数:

#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;

2 个答案:

答案 0 :(得分:3)

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

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

第三,转到http://gcc.godbolt.org/

<强> Live On Godbolt

enter image description here

答案 1 :(得分:1)

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

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

任何代码中的分支 - 不仅仅是内联函数中的分支 - 都可能被优化出来&#34;如果编译器可以检测到始终遵循相同的分支。

如果一个现代编译器将另一个函数作为内联的更好候选者进行求值,那么它们也足够聪明,不能内联声明为inline的函数。与典型的C / C ++程序员相比,许多现代编译器可以做出更好的决策。