是否有可能不是在函数中检查 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/