c++ - 函数指针与条件分支

标签 c++ conditional-statements branch

是否有可能不是在函数中检查 bool(从而分支),而是预先评估 bool 并仅将函数指针更改为所需行为会更快?

考虑:

#include <iostream>

class A
{
public:
    A()
    {
        workTrue = [] () { std::cout << "True" << std::endl; };
        workFalse = [] () { std::cout << "False" << std::endl; };
        SetArgs(false);
    }

    void SetArgs(bool _b)
    {
        b = _b;
        work = b ? &workTrue : &workFalse;
    }

    void DoWork()
    {
        (*work)();
        // b ? workTrue() : workFalse();
    }

private:
    std::function<void()> workTrue;
    std::function<void()> workFalse;
    std::function<void()>* work;
    bool b;
};


int main()
{
    A a;
    a.DoWork();
}

注意:这是与 Pointer dereferencing overhead vs branching / conditional statements 相同的问题,只是以更抽象的形式。这个链接中的问题没有得到令人满意的回答,因为问题的核心(de-ref vs branch)在很大程度上被忽略了。

最佳答案

最好遵循工厂设计模式。像下面这样:

#include <iostream>

class WorkFactory
{
 public:
    WorkFactory()
    {
    }
    virtual void Work() = 0;
};

class WorkFalse : public WorkFactory
{
 public:
    WorkFalse()
    {
    }
    void Work() final
    {
        std::cout << "False" << std::endl;
    }
};

class WorkTrue : public WorkFactory
{
 public:
    WorkTrue()
    {
    }
    void Work() final
    {
        std::cout << "True" << std::endl;
    }
};

int main()
{
    WorkFactory* w;
    bool var = false;
    if (var)
    {
        w = new WorkTrue();
    }
    else
    {
        w = new WorkFalse();
    }

    w->Work();
}

关于c++ - 函数指针与条件分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59783285/

相关文章:

维克斯。如何在修复过程中不重新安装功能?

visual-sourcesafe - 项目级别的 SourceSafe 合并

git - 推送到远程分支以进行 pull 请求

python - 将 C 库与 Cython 一起使用时出现错误

C++11 如何代理只有名称和父类的类函数?

C++ switch 语句评估

git - 使用 Git 将更改从 master merge 到所有分支?

c++ - chdir() 返回 0,但在 chdir() 调用后的下一行中调试显示目录​​没有改变

c++ - 存储稀疏矩阵&高效迭代

conditional-statements - verilog模块的条件实例化