我有一个函数f(int x, float y, char* z, .., bool b)。参数b仅以下列方式使用:
if (b) {
...
} else {
...
}在功能体的各个部分。出于效率原因,我想有效地创建两个函数f0和f1,其中b分别设置为false和true,以避免在运行时计算条件。同时,由于f的实现相当长,我不想分别显式地定义f0和f1。是否有编译器优化特性在编译时自动生成这两个分支函数?
也许有更好的设计模式可以完全避免这种思维方式?请记住,条件b可以在一个庞大的循环中计算。
发布于 2018-12-28 09:18:06
模板允许对这类代码进行分解,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之前的保证,你必须专门处理发散部分。
发布于 2018-12-28 06:18:31
使用模板:
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, "");
}https://stackoverflow.com/questions/53954384
复制相似问题