2

人々は通常、大きなオブジェクトのリストをコピーすることをどのように管理していますか?

これが私の状況です:

現在、私はこれを持っています:

typedef std::vector<float> Image;  

そして、私はそれを

std::list<Image> lst;

Image.size() は非常に大きいです (それぞれが 3 ~ 5 MB です)。

リストを渡します (コピーします)。

std::vector が各要素を値でコピーするという私の理解は正しいですか? もしそうなら、コピーが多すぎてパフォーマンスが少しひどいのではないでしょうか?

コピーを最小限に抑えるにはどうすればよいですか? 代わりに保存する必要がありますか

std::list<ImageRef> lst;

どこ

typedef boost::shared_ptr<Image>   ImageRef;

?

この種の問題を処理するエレガントな方法は何ですか?

4

4 に答える 4

5

組み込み型よりも大きなオブジェクトは、ほとんどの場合、値渡しよりも参照渡しの方が安価です。オブジェクトのサイズが約 3 メガであり、それを他のユーザーに渡す必要がある場合は、コピーしないでください。

すべての STL 型は値のセマンティクスを使用します。つまり、コンテンツをコピーします。ポインターのコンテンツが存在する可能性があることに注意してください。その場合、ポインターが参照するものではなく、ポインターがコピーされます。

image-list を参照渡しするのも良い考えかもしれません。多くのスマート ポインターのコピーを節約するため、多くの参照カウント管理が節約され、多くのロック/ロック解除が節約される可能性があります。

于 2009-07-10T17:19:40.183 に答える
3

リストがコピーされたときに s がコピーされなくてもかまわないboost::shared_ptr限り、ルートは良いアプローチだと思います。Imageコピーを最小限に抑えますが、参照カウントは、最後のリストが破棄されたときにもクリーンアップします。

于 2009-07-10T17:20:36.143 に答える
1

まず、私は

typedef std::list<Image> ImageList;

1 つのリストを操作して操作する必要がある場合は、参照を ImageList 自体に渡します。そのように何かをコピーする必要はありません。元のリストを保存してそのコピーを作成する必要がある場合は、boost::shared_ptr が最適です。

于 2009-07-10T17:26:01.403 に答える