在下面的模板函数示例中,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