5

私は2つの関連する質問があります。1つは一般的なもので、もう1つは私が取り組んでいるプロジェクトに固有のものです。

  1. 一般に、コードの一部が特定の条件下で実行される反復(数百万)が多いループがある場合は、複数の条件ステートメントを含む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回だけチェックされるため、冗長性を犠牲にしてより効率的なコードが得られるようです。ただし、一般的なコードが巨大である場合、または考えられる条件が多数ある場合、これは非常に冗長に見えます。

  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 に答える