0

ネットワークから特定のエントリを受け取ります。これは証券取引所の相場で、「HP 100 1」、「HP 101 10」、「HP 102 3」などです。

1 つのネットワーク パケットには、1 つまたは複数のエントリが含まれる場合があります。理論的には、ネットワーク パケットに含まれるエントリの数には制限がありますMaximum transmission unit of the network / sizeof(entry)。ただし、この制限は、マシンやアプリケーションが起動される場所によって異なる場合があります。

新しいパケットを受け取るたびに、エントリをコレクションに保存する必要があります。以前のアイテムを削除して、コレクションに新しいアイテムを配置するだけです。現在、コレクションに現在の数のアイテムが含まれており、新しい数のアイテムを受け取ったとします。

  • NEW <= CURRENT コレクションの場合、1) 最初の NEW アイテムを再構成できます。2) コレクションの長さを NEW にリサイズします 3) 残りのアイテムをドロップしないでください。それらは次のパケット処理中に再利用されるためです
  • NEW > CURRENT コレクションの場合、1) コレクションの容量が NEW アイテムを格納するのに十分であることを確認し、コレクションのサイズを変更して必要な数のアイテムをインスタンス化するよりも十分でない場合。2) 新しいアイテムを再構成できるようにします。

したがって、アイデアは単純です。

  • コレクションが大きくなり、まもなくサイズが ~ になるはずですMaximum transmission unit of the network / sizeof(entry)
  • その後、新しいオブジェクトを割り当てる必要はなく、既に割り当てられているオブジェクトのみを再利用して再構成する必要があります。コレクションの長さが 1 に減少しても、残りの 1000 アイテムはドロップしないでください。次のステップでコレクションの長さが再び 1000 になり、これらのアイテムを再利用するからです。

既存stlまたはboostコレクションのいずれかをそのように使用できる場合、または自分で作成する必要がありますか?

実際には純粋な配列を使用できますが、実行時でも最大サイズを計算できないため、不足している部分のほとんどは「自動拡張」になります。

別のオプション-既存のコレクションを使用できますが、さらにその「サイズ」を自分で保存します。コレクションのサイズを決して小さくしないでください。代わりに、常に「サイズ」の「私の」コピーを使用してください。コレクションのサイズを減らすことはないので、アイテムをドロップすることはありません。これは機能するはずですが、少し「トリッキー」になります。

4

1 に答える 1

0

の容量はstd::vector必要に応じて増加しますが、減少することはありません。これはあなたのニーズに合っているようです。

アイテムをベクターにプッシュし、終了したらベクターをクリアするだけです。次に、次の一連のアイテムにベクトルを再利用します。

または、ベクターのサイズを変更して、アイテムを特定のindexに配置することもできます。後続のアイテムのセットについて、同じベクトルで繰り返し実行します。

どちらの場合も、ベクトルはその容量を保持しています。

ベクターの初期容量を予約することもできます。

技術的には、これはオブジェクト (サイズ変更オプションの既存のオブジェクトを除く) を再利用しませんが、割り当てられたメモリを再利用することに注意してください。ただし実際には、毎回オブジェクトを変更しているため、これで十分なはずです (特に POD オブジェクトを使用する場合)。

于 2013-04-24T12:10:15.693 に答える