c++ 编译器优化是否可以针对布尔参数生成两个版本的函数
Can c++ compiler optimization generate two versions of a function with respect to a boolean argument?
我有一个函数f(int x, float y, char* z, .., bool b)
.参数b
仅以以下方式使用:
if (b) {
...
} else {
...
}
在函数体的各个部分。出于效率原因,我想有效地创建两个函数f0
和f1
,其中b
分别设置为 false
和 true
,以避免在运行时评估条件。同时,由于f
的实现相当长,我不想明确定义f0
和f1
分开。是否有任何编译器优化功能可以在编译时自动生成这两个分支函数?
也许有更好的设计模式可以完全避免这种思路?请记住,条件b
可以在大规模循环中进行评估。
模板允许分解这种代码,而 C++17 允许它与 if constexpr
一起干净利落地
template<bool b>
void f(int x, float y, char *z)
{
// ...
if constexpr (b)
{
// ...
}
else
{
// ...
}
// ...
}
// if you still need runtime dispatch
void f(int x, float y, char *z, bool b)
{
return b ? f<true>(x, y, z) : f<false>(x, y, z);
}
如果没有if constexpr
,不能保证运行时没有分支,但编译器可以很容易地正常完成。因此,如果您想要 C++17 之前的保证,您必须专注于发散部分
按专业:
template <bool b> void f_impl(..); template <> void f_impl<true>(..) { /*..*/ } template <> void f_impl<false>(..) { /*..*/ } template<bool b> void f(int x, float y, char *z) { // ... f_impl<b>(..); // ... }
或标记调度:
void f_impl(std::true_type, ..) { /*..*/ } void f_impl(std::false_type, ..) { /*..*/ } template<bool b> void f(int x, float y, char *z) { // ... f_impl(std::integral_constant<bool, b>{}..); // std::bool_constant<b> in C++17 // ... }
使用模板:
template<bool b>
void f(int x, float y, char *z)
{
if (b)
{
...
}
else
{
...
}
}
...
if (runtimeCondition)
{
f<true>(1, 2, "");
}
else
{
f<false>(1, 2, "");
}
相关文章:
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何比较两个函数的速度和性能
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 如何将这两个函数组合成一个实现?
- 将具有相反操作数的两个函数重构为一个
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 具有相同主体的两个函数具有不同的名称
- 通过作为类的公共成员的两个函数将函数作为参数传递
- 如何使用排序和比较这两个函数在 c++ 中对字符数组进行排序?
- 是否可以在C++中将两个函数一起添加
- C++ 两个函数除了一行之外执行相同的操作
- 如何编写连接两个函数的函数
- 如何执行两个函数参数具有相同的模板类型
- 当两个函数位于一行中时,堆栈框架的样子
- 为什么这两个函数的行为不同
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 系统堆栈中的两个函数的递归调用(将不同数量的数组作为参数传递)有什么区别
- 如何在一个构造函数中使用两个可变参数模板参数来绑定两个函数
- 如何在c++中的两个函数中传递对象的同一实例