1

頻繁に更新される大きな配列の適切な構造を探しています。ご協力いただきありがとうございます!背景は次のとおりです。特定の期間の音波を表す連続曲線を描きたいと思います。精度のために、配列の長さはほぼ 44100 になります (CD フォーマット)。そして、最後の 2 番目の波を表現したいだけなので、配列は非常に頻繁に更新されます。1/44100 秒ごとに、最初の要素が削除されます。新しい最後の要素が配列に挿入されます。

頻繁な「malloc/realloc/new」を避けるために、私の現在の解決策は、固定サイズが 44100 の循環キューを使用していますが、動的にキューのサイズを変更したい場合、どういうわけかこれが最も適切な解決策ではないと感じています、多額の費用がかかります。この種の状況は非常に頻繁に発生するはずです。おそらく、この問題に関する適切な特許がいくつかあると思います。みんなありがとう!

4

1 に答える 1

2

配列には常に固定数のアイテムがあると思います。そのため、どのような場合でもリングバッファーを使用するだけです(それが「循環キュー」と呼ばれるものかどうかはわかりませんが、動的な長さを使用すると思いますか?そうなら、なぜですか?特定の絶対値はありません(そして実用的な)最大?)、つまり、変数のエントリポイントを開始点とする静的配列:

const unsigned int buffer_length = 500000;
float *buffer = new float[buffer_length];

unsigned int buffer_write = 0;

// append a value...
buffer[buffer_write] = my_value;
// ...and move the write/end position:
buffer_write = (buffer_write + 1) % buffer_length;

値を出力/使用するには、最初に読み取るエントリのインデックスに次の式を使用できます。

unsigned int start_position = (buffer_length + buffer_write - length_to_read) % buffer_length;

反復するには、位置を次々と追加し、再びモジュロを使用して配列の先頭に戻ります。

于 2013-01-01T23:39:46.513 に答える