首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++编译器优化可以生成与布尔参数相关的函数的两个版本吗?

c++编译器优化可以生成与布尔参数相关的函数的两个版本吗?
EN

Stack Overflow用户
提问于 2018-12-28 06:10:45
回答 2查看 180关注 0票数 0

我有一个函数f(int x, float y, char* z, .., bool b)。参数b仅以下列方式使用:

代码语言:javascript
复制
if (b) {
 ...
} else {
 ...
}

在功能体的各个部分。出于效率原因,我想有效地创建两个函数f0f1,其中b分别设置为falsetrue,以避免在运行时计算条件。同时,由于f的实现相当长,我不想分别显式地定义f0f1。是否有编译器优化特性在编译时自动生成这两个分支函数?

也许有更好的设计模式可以完全避免这种思维方式?请记住,条件b可以在一个庞大的循环中计算。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-28 09:18:06

模板允许对这类代码进行分解,C++17允许使用if constexpr干净地分解这类代码。

代码语言:javascript
复制
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之前的保证,你必须专门处理发散部分。

  • 按专业划分: 模板f_impl(.);模板<> void f_impl(.){.*/}模板<> f_impl(.){.*/}模板f_impl f(int x,浮y,char *z) {/.f_impl( .. );// .}
  • 或标签发送: f_impl(std::true_type,.){/*.*/} void f_impl(std::false_type,.){/*.*/}模板void f(int x,浮y,char *z) { // .f_impl(std::integral_constant{}.);// std::bool_constant in C++17 // .}
票数 2
EN

Stack Overflow用户

发布于 2018-12-28 06:18:31

使用模板:

代码语言:javascript
复制
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, "");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53954384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档