我认为我有严重的编译器不信任。如果内联函数中的分支具有恒定的结果,它们是否会被优化出来?
对于示例函数:
#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;
答案 0 :(得分:3)
首先,它甚至不会编译(直到你添加一个返回类型)。
其次,swap
是一个非常糟糕的名称(因为它没有swap
,并且与std::swap
名称冲突)。
第三,转到http://gcc.godbolt.org/:
<强> Live On Godbolt 强>
答案 1 :(得分:1)
一般来说,这些问题的答案取决于编译器。
要使用您的代码,编译器(和编译器版本)以及编译器设置(例如优化标志)来回答您的问题,您需要检查编译器输出的代码。
任何代码中的分支 - 不仅仅是内联函数中的分支 - 都可能被优化出来&#34;如果编译器可以检测到始终遵循相同的分支。
如果一个现代编译器将另一个函数作为内联的更好候选者进行求值,那么它们也足够聪明,不能内联声明为inline
的函数。与典型的C / C ++程序员相比,许多现代编译器可以做出更好的决策。