Хотя в SO уже есть довольно много вопросов о конструкторах копирования / операторах присваивания, я не нашел ответа, подходящего для моей проблемы.
У меня есть класс, подобный
class Foo
{
// ...
private:
std::vector<int> vec1;
std::vector<int> vec2;
boost::bimap<unsigned int, unsigned int> bimap;
// And a couple more
};
Теперь кажется, что происходит некоторое чрезмерное копирование (на основе данных профиля) .. Поэтому мой вопрос заключается в том, как лучше всего решить эту проблему?
Должен ли я реализовать пользовательский оператор конструктора / назначения копирования и использовать swap?Или я должен определить свой собственный метод обмена и использовать его (при необходимости) вместо присваивания?
Поскольку я не эксперт по c ++, примеры, показывающие, как правильно справиться с этой ситуацией, очень ценятся.
ОБНОВЛЕНИЕ: Похоже, я не совсем ясно ..Позвольте мне попытаться объяснить.Программа в основном представляет собой программу поиска в ширину «на лету», и для каждого предпринятого шага мне нужно сохранять метаданные об этом шаге (это класс Foo
). Теперь проблема в том, что есть (обычно)экспоненциально, так что вы можете себе представить, что нужно сохранить большое количество этих объектов. Я всегда передаю (const) ссылку, насколько мне известно. Каждый раз, когда я вычисляю преемника из узла в графе, мне нужносоздайте и сохраните ОДИН объект Foo (однако, некоторые члены данных будут добавлены к этому следующему элементу в дальнейшем при обработке этого преемника) ..
Данные моего профиля показывают примерно что-то вроде этого (я нена этой машине нет фактических чисел):
SearchStrategy::Search 13s
FooStore::Save 10s
Таким образом, вы можете видеть, что я трачу почти столько же времени на сохранение этих метаданных, сколько и на поиск по графику ... О, и FooStore сохраняет Foo
в google::sparse_hash_map<long long, Foo, boost::hash<long long> >
.
Компилятор g ++ 4.4 или g ++ 4.5 (я не на своем компьютере разработчика, поэтому я не могу проверить в данный момент) ..
ОБНОВЛЕНИЕ 2 назначаю такя из членов после создания экземпляра Foo вроде
void SetVec1(const std::vector<int>& vec1) { this->vec1 = vec1; };
Думаю, завтра я должен изменить это, чтобы использовать метод swap, который определенно должен немного улучшить это ..
IПрошу прощения, если мне не совсем понятно, какой семантики я пытаюсь достичь, но причина в том, что я не совсем уверен.
С уважением,
Мортен