2013-09-02 18 views
7

私は値の履歴を保持する配列を持っています。新しい値を追加するときには、以前の値をすべて1つ左にシフトして、最も古い値を失い、次の値を確保します。Cで配列をシフトする最も良い方法は?

私はMEMMOVEを使用することにより、これを行うには二つの方法を考えることができます。

memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr)); 

またはポインタを交換することにより:

for (i = 0; i != sizeof(arr) - 1; i++) { 
    *(arr + i) = *(arr + i + 1); 
} 

は2つの方法の間のパフォーマンスの違いはありますし、場合そうではない、どちらがアドバイスされるだろうか?

+1

これに対して配列を使用しないと思われましたか、それはオプションではありませんか? – nic

+1

@nic最後のX値を追跡する必要があるので、配列を除いてそれらを格納するための論理的な方法は考えられません。 – Muis

+0

キューを使用して(まだ配列を使用して実装することができます)、メモリのコピーは避けてください。 http://www.thelearningpoint.net/computer-science/data-structures-queues--with-c-program-source-code –

答えて

3

これらはどちらも同じ時間の複雑さを持っています。それ以外のパフォーマンスの違いは、CPU、コンパイラ、memmoveの実装方法、配列のサイズなどの特定の状況に起因するため、実際に各方法でパフォーマンスを測定し、最適なものを確認する必要があります。

+1

アセンブリの出力を読むことは有益なことかもしれません。 – chrylis

1

私は配列がこれを行うための最善の方法ではないと思います。リンクされたリストを使ってみてください。この問題はありません。

7

速くオプションがあります:

circular bufferどこ挿入、削除、リードはすべてO(1)です。

0

リンクリストまたは配列として実装されたFIFO Queueを使用できます。あなたの説明から、最も簡単な解決策です。

関連する問題