1

これがばかげた質問であるならば申し訳ありませんが、私はまだコンピュータサイエンスに精通していません。これはアルゴリズムの速度の問題です。

このような質問に出くわし、取り組むことにしました。私の計画は、正確な結果を得るために、必要に応じてフィボナッチ数列をインクリメントすることです。

これが私がどのようにインクリメントするかです。

unsigned int last(1), current(1) ;
unsigned int sum = 0 ;

looping
{
   ...
   current += last ;
   last = current - last ;
}

これは確かに必要な増分と同じくらい良いと思います。そして、私の限られた知識を考えると、おそらく私が考えることができるのと同じくらい良いと思います。しかし、これら2つの変数のみを使用して同じ増分を行う特別な方法はありますか?おそらく私は私の考えが間違っていますが、代わりにこれを行う方が速いでしょうか:

temp = current ;
current += last ;
last = temp ;

以前よりも視覚的に1つ多くのステートメントがあり、1つの追加の変数があります。どちらも同じことをしますが、どちらかが速く、メモリの使用量が少ないように感じます。私は正しいですか、どれが最も効率的であると考えられていますか?

ちなみに、私はポインタの使用経験があまりありませんが、int型の標準では各データは通常4バイトであるため、ポインタはあまり変更されないと思いますか?50バイトを使用するカスタムタイプがポインターを使用する方が良い理由は理解できますが、2番目のアルゴリズムには役立ちますか?

4

2 に答える 2

7

ダメダメダメ。コードをシンプルかつ明確に保ちます。このような明らかな最適化は、実際には改善である場合、コンパイラによって行われます。

ちなみに、GCC では、これら 2 つの関数はまったく同じ 5 つのアセンブリ命令を生成します。

    void sum1(int * __restrict last, int * __restrict current)
    {
            int temp = *current;
            *current += *last;
            *last = temp;
    }

    void sum2(int * __restrict last, int * __restrict current)
    {
            *current += *last;
            *last = *current - *last;
    }

したがって、GCC は、それらが常に同じ結果を生成し、おそらく他のコンテキストでも同等のものとして扱うことを理解しています。そのため、意図をより明確に表現し、理解しやすく維持しやすいものを使用してください。

于 2012-12-27T09:43:43.770 に答える
1

std :: tuple:を使用できます

unsigned int last(1), current(1);

looping
{
    ...
    //`std::tie` creates a tuple containing references to `last` and `current`
    //`std::make_tuple` creates a tuple containing the new values. 
    std::tie(current, last) = std::make_tuple(current+last, current);
}
于 2012-12-27T12:38:43.203 に答える