设置:
我有一个使用SIMD内在函数的函数,并希望在一些constexpr函数中使用它。
为此,我需要让它成为constexpr。但是,SIMD内在函数未标记为constexpr,并且编译器的常量赋值器无法处理它们。
我尝试用C ++ constexpr实现替换SIMD内在函数,它实现了同样的功能。该函数在运行时变慢了3.5倍,但我能够在编译时使用它(是吗?)。
问题:
如何在常量表达式中使用 this function 而不会在运行时减慢我的程序?
一些想法:
更实用的解决方案是:
无论如何,我对任何可以解决我问题的建议持开放态度。
提示:
__builtin_constant_p
来检测函数参数是否都是常量表达式,在这种情况下编译器至少会尝试在编译时评估函数。尝试失败:
答案 0 :(得分:4)
我会这样做
constexpr int doit(int input, bool inconst = false) {
return inconst ? doitconsty(input) : doitfast(input);
}
如果对doit
的调用是在constexpr
函数内部,可以调用它来在运行时或编译时执行某些操作,只需转发标志
constexpr int f(int n, bool inconst = false) {
/* ... */
int importantInt = doit(n / 42, inconst);
/* ... */
return magicResult;
}
如果我没有弄错的话,任何constexpr
评估都会有所启动。通过inconst
那里
enum foo { bar = f(256, true) }
如果您在运行时世界,只需像其他任何事情一样致电f
int main() { std::cout << "test-case: " << f(256); }
应该注意,这对运算符不起作用,因为你不能在那里添加布尔参数。相反,你可以用不同的方式传递值,如果这对你来说很好(对于像int
和bool
这样的原始值,我们也不能重载运算符)。
template<typename T>
struct maybe_const_value {
T t;
bool isconst;
};
enum foo { bar = maybe_const_value{256, true} % magicTransform };
int main() { return maybe_const_value{265} % magicTransform; }
然后,操作员功能可以检查input.isconst
并使用input.t
作为实际值。