1

取得して処理するデータが大量にあり (100 万近く)、プログラム全体でデータをコピーしたり移動したりしたくありません。

例を挙げて状況を説明しましょう。100.000 要素を持つベクターがあります。そして、これらの要素がベクターに挿入された時間を追跡したいと思います。そのため、時間とデータの両方をマップに保持することをお勧めします。しかし、私はまだベクターを使いたいと思っています。Map の 2 番目の要素が Vector を表示するが、リソースを不必要に無駄にしないようにする方法はありますか?

最初に頭に浮かぶのは、Vector にデータのアドレスを含めることです。ただし、ポインターは 4 バイトを使用し (不明)、たとえば、char のアドレスを含めたい場合、データ自体の 4 倍の大きさになります。

何か案は ?

4

2 に答える 2

0

それはメモリ消費の問題だけでなく、一貫性の問題でもあると思います。元の入力データでさまざまなビューをどのように使用するかによって異なります。std::unique_ptr一般に、元のデータとビューでの参照に使用することをお勧めstd::weak_ptrします。

しかし、ポインターのサイズが指すオブジェクトのサイズを超えているため、特定のメモリ使用量のオーバーヘッドが発生する可能性があることは正しいです。

後者の場合、FlyWeightパターンの実装のようなものを使用する方が適切な場合があります。

于 2013-07-31T19:28:17.703 に答える
0

複数のコンテナーに単一のデータを含める

はい。Boost Multi-index Containers Libraryを使用して、コンテンツを複製することなく、同じデータを複数の方法でインデックス化できます。自作XXX_ptrのソリューションとは異なり、マルチインデックス コンテナーはすべての一貫性を維持します (コンテナーからデータ ユニットを削除すると、自動的にすべてのインデックスから削除されます)。

アプリケーションの要件、特殊性、およびデータ挿入/ライフサイクル パターンによっては、軽量でより専門的なソリューション (および、muklti-index コンテナーや自作XXX_ptrソリューションよりも効率的である可能性があります) も可能になる場合があります。

  • 元のベクトルのメモリ レイアウトを変更しないでおく必要がありますか?それとも、何らかの派生型のベクトルに対応できますか?
  • ベクターコンテンツは変更されますか? それは成長できますか?
  • とにかく、その中の要素は時系列で(挿入および保持されますか)?
  • ベクトルの位置に加えて、挿入時間によってベクトル要素を検索する必要がありますか?
于 2013-07-31T19:46:08.503 に答える