5

我有两个相关的问题,一个是一般性的,一个是针对我正在从事的项目的具体问题。

  1. 一般来说,如果我有一个包含大量迭代(数百万次)的循环,并且某些部分代码在特定条件下执行,那么让一个带有多个条件语句的循环还是多个没有它们的循环更好(更有效)。例如。

示例 1:

while (something())
{
    // some common code
    if (condition_a)
        // some code
    if (condition_b)
        // some code
    // some more common code
}

示例 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 //...

似乎示例 2 会以冗余为代价产生更高效的代码,因为条件只检查一次而不是数百万次。如果通用代码很大或者有很多可能的情况,这似乎是非常多余的。

  1. 现在到我的具体问题。我有一个从文件中读取点并将它们插入数据结构的函数。它看起来像这样:

    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 // ...
}
4

2 回答 2

3

要回答您的具体问题:读取文件所需的时间将超过 if/else 所花费的时间。写任何更具可读性的东西。这通常更有效,并且在您证明它是一个瓶颈之前不要对其进行优化。

回答您的一般问题:取决于很多事情,现代编译器非常擅长独立于您的直觉有效地做事。因此,在您拥有特定编译器和架构的工作代码之前,这是一个理论上的讨论。

于 2012-06-13T16:24:28.727 回答
2

理想情况下,我想使用函数指针来事先决定正确的函数,但是我认为这是不可能的,因为 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)();

或者,如果您对它们不满意,只需创建自己的免费函数来包装方法调用:

void read_point( Reader* reader ){ reader->read_point(); }
void read_inside_circle( Reader* reader ){ reader->read_inside_circle(); }

并改用常规函数指针。

于 2012-06-13T16:23:33.797 回答