jah*_*aho 5 c++ performance loops function-pointers
我有两个相关的问题,一个是普通的,一个是我正在研究的项目.
例1:
while (something())
{
// some common code
if (condition_a)
// some code
if (condition_b)
// some code
// some more common code
}
Run Code Online (Sandbox Code Playgroud)
例2:
if (condition_a && condition_b)
{
while (something())
{
// some common and specific code
}
}
else if (condition_a)
while (something()) //..
else if (condition_b)
// Another loop
else //...
Run Code Online (Sandbox Code Playgroud)
似乎示例2将以冗余为代价导致更高效的代码,因为条件仅被检查一次而不是数百万次.如果公共代码很大或者有很多可能的条件,那么这似乎是多余的.
现在来看我的具体问题.我有一个函数,它从文件中读取点并将它们插入到数据结构中.它看起来像这样:
while(reader-> read_point){//做一些事//插入点}
问题在于,有几个函数用于读取应根据用户提供的标准使用的点.例如read_point_inside_circle(),read_point_inside_rectangle()等.
理想情况下,我想使用函数指针事先决定正确的函数,但我不认为这是可能的,因为reader是Reader类的一个实例(如果有可能以某种方式解决我的所有问题).
在这种情况下,如果我有多个循环只有条件不同,或者我应该使用多个if语句以避免冗余代码,那就更好了,例如.
for(;;)
{
if (read_every_point)
if(!reader->read_point())
break;
else if (read_inside_circle)
if(!reader->read_inside_circle())
break;
else if // ...
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想使用函数指针预先决定正确的函数,但是我认为这是不可能的,因为 reader 是 Reader 类的实例(如果有可能以某种方式解决我的所有问题)。
您可以使用成员函数指针来实现此目的,假设所有读取函数都具有相同的签名:
typedef void (Reader::*read_fun_t)();
read_fun_t read_fun = &Reader::read_point;
// or
read_fun_t read_fun = &Reader::read_inside_circle;
...
(reader->*read_fun)();
Run Code Online (Sandbox Code Playgroud)
或者,如果您对它们不满意,只需创建自己的自由函数来包装方法调用:
void read_point( Reader* reader ){ reader->read_point(); }
void read_inside_circle( Reader* reader ){ reader->read_inside_circle(); }
Run Code Online (Sandbox Code Playgroud)
并使用常规函数指针代替。