Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针与条件分支_C++_Conditional Statements_Branch - Fatal编程技术网

C++ 函数指针与条件分支

C++ 函数指针与条件分支,c++,conditional-statements,branch,C++,Conditional Statements,Branch,有没有可能不检查函数中的bool(从而分支),而是提前计算bool并将函数指针更改为所需的行为会更快 考虑: #include <iostream> class A { public: A() { workTrue = [] () { std::cout << "True" << std::endl; }; workFalse = [] () { std::cout << "False" <&

有没有可能不检查函数中的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();
}
#包括
甲级
{
公众:
()
{

workTrue=[](){std::cout最好遵循工厂设计模式。如下所示:

#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();
}
#包括
阶级工厂
{
公众:
工场(
{
}
虚空功()=0;
};
类WorkFalse:公共工作工厂
{
公众:
工作假()
{
}
无效工作()最终版本
{

std::我不能确定,但我可以想象,如果您可以完全消除函数调用,那么
DoWork()
中的分支应该会更快找到并优化问题的答案取决于许多因素。您是否尝试过实现它并对结果进行基准测试?您的基准测试是否将此领域确定为代码中的性能瓶颈?请注意,
std::function
应用类型擦除,这也会带来大量开销。分支可能是,也可能不是aster,这取决于许多因素。请注意,您可以使用成员函数指针,而不是
std::function
,但是,您的替代方法必须是成员函数。是否可能?是的。所有方法都能保证吗?否。通过您选择的任何度量,是否有任何特定方法保证始终是最优的?否。跳转预测和分支预测。我认为目前分支预测做得更好。