在下面的模板函數示例中,for
循環內部的中央if
保證被優化,只保留使用的指令?帶模板布爾參數的函數:保證被優化?
如果不能保證優化(在GCC 4,MSVC 2013和llvm 8.0中),有什麼選擇,最多使用C++ 11?
請注意,這個函數沒有任何用處,我知道這個特定的函數可以通過幾種方式進行優化等等。但我想要關注的是如何在生成代碼中使用bool
模板參數。
template <bool IsMin>
float IterateOverArray(float* vals, int arraySize) {
float ret = (IsMin ? std::numeric_limits<float>::max() : -std::numeric_limits<float>::max());
for (int x = 0; x < arraySize; x++) {
// Is this code optimized by the compiler to skip the unnecessary if?
if (isMin) {
if (ret > vals[x]) ret = vals[x];
} else {
if (ret < vals[x]) ret = vals[x];
}
}
return val;
}
我認爲這不是優化,因爲在C++中幾乎沒有保證的優化。不過,我希望合理的編譯器能夠做到這一點,因爲它可能會首先生成函數代碼並優化它,並且優化'if(true)'應該很容易。 – yeputons
不,但在C++ 17中,你可以使用'如果constexpr(isMin){'。 – flyx
@yeputons ok,編輯我的問題。只有C++ 11有什麼好的選擇? – manatttta