C ++ Хранение больших данных в std :: list <> ... следует ли использовать подсчет ссылок? - PullRequest
2 голосов
/ 10 июля 2009

Как люди обычно управляют копированием списка больших объектов вокруг?

Вот моя ситуация:

В настоящее время у меня есть это:

typedef std::vector<float> Image;  

и я храню его в

std::list<Image> lst;

Image.size () довольно большой (каждый занимает ~ 3-5 МБ).

Я передаю (копирую) список вокруг.

Правильно ли я понимаю, что std :: vector будет копировать каждый элемент по значению? Если это так, производительность может быть немного ужасной из-за чрезмерного копирования?

Что я могу сделать, чтобы минимизировать копирование? Должен ли я хранить

std::list<ImageRef> lst;

, где

typedef boost::shared_ptr<Image>   ImageRef;

?

Какой элегантный способ решения этой проблемы?

Ответы [ 4 ]

5 голосов
/ 10 июля 2009

Объекты большего размера, чем встроенные типы, чаще всего обходятся дешевле по ссылке, чем по значению. Поэтому, если ваш объект имеет размер около 3 мегабайт, и вам нужно передать его, пожалуйста, не копируйте его!

Все типы STL используют семантику значений: они копируют свой контент. Обратите внимание, что контент может существовать из указателей. В этом случае копируются указатели, а не те, к которым они относятся.

Это может быть даже хорошей идеей, чтобы передать ваш список изображений по ссылке. Сохраняет большое количество копий смарт-указателей, поэтому экономит много средств управления подсчетом ссылок и может сохранить много блокировок / разблокировок.

3 голосов
/ 10 июля 2009

Я думаю, что маршрут boost::shared_ptr - это хороший подход, если не имеет значения, что Image не копируются при копировании списка. Вы сведете к минимуму копирование, но подсчет ссылок также очистит вас после уничтожения последнего списка.

2 голосов
/ 10 июля 2009

Не заглядывайте в контейнер повышения указатель . Копирование boost :: shared_ptr дешево, но не так дешево. Подсчет ссылок тоже не бесплатный. Если вы много копируете и вам не нужно обмениваться отдельными объектами Image, лучше использовать контейнеры с указателями Boost.

1 голос
/ 10 июля 2009

Во-первых, я бы

typedef std::list<Image> ImageList;

Если вам просто нужно работать с одним списком, манипулировать им, передавайте ссылки в сам ImageList. Не нужно ничего копировать таким образом. Если вам нужно сохранить исходный список и сделать его копии, лучше использовать boost :: shared_ptr.

...