Некоторое время я играю с работой, и я все еще не уверен, какое лучшее решение.
Я прочитал много статей, а также сделал тесты производительности:
Например, возьмите Контейнер (например, вектор строк) с большим количеством элементов. Копирование было бы очень дорогостоящим. Поэтому возвращение его в качестве справочника было бы хорошим решением.
//Vector
vector<string>& GetVector()
{
return vecy;
}
Я протестировал это решение на Windows 8.1 VS2013 Express (в цикле ofc) и стандартной версии (оптимизация 02) по сравнению с возвратом по значению.
Разница была огромная, и повторение ссылки было очень быстрым.
Сегодня я сделал тот же тест на MAC OS-X, используя XCode, который использует оптимизацию -0s для стандартной сборки выпуска.
Здесь возврат по значению был намного быстрее, чем возврат его по ссылке (похоже, оптимизация работала лучше).
Мой первый вопрос: что было бы лучшим решением сейчас? Или нет лучшего решения, и мне просто нужно настроить свой код на компилятор?
Я знаю, что другим решением будет использование перемещения С++ 11, но что, если я хочу сохранить вектор на моем объекте, но также и где я вызываю GetVector(); (но без копирования).
2) Вопрос:
Что вы думаете о следующем коде
vector<string> vec;
vector<string>* GetVector()
{
return &vec
}
функция вызова:
vector<string>* vec2 = GetVector();
(Скажем, я точно знаю, как долго живет объект, который возвращает указатель на мой вектор)
Использование этого метода с указателем было самым быстрым в моих тестах производительности, но является ли это хорошим решением? Было бы лучше использовать smart_pointers, но как? Или есть другие решения?
Для getter просто верните ссылку (const
).
Чтобы построить вектор (начиная с С++ 11), вернитесь по значению (и в худшем случае у вас есть движение).
Вы не можете сравнить скорость тестирования того, как компиляторы на разных платформах обрабатывают контейнеры STL. Обработка контейнеров STL с помощью кода оптимизируется на уровне компилятора, и вы дадите разные результаты.
Вполне возможно, что std :: map будет действовать совершенно иначе, чем std :: vector, и будет быстрее, например, на платформе Windows.
Если вам нужны самые быстрые методы на обеих платформах, я боюсь, что вам понадобятся команды препроцессора.
В С++ 11, если это не общий объект, вы можете воспользоваться конструктором move, просто сделав:
vector<string> GetVector()
{
// do something
return vec;
}
vector<string> vec
не является статическим / глобальным, как действителен адрес, если вы хотите использовать его где-то еще? Вы должны были использоватьstd::shared_ptr<>
. Вопрос 1 - Я полагаю, что по этому поводу будет много противоречивых мнений, поскольку вы затронули очень распространенную и в то же время чувствительную область управления памятью на C / C ++. Я буду ждать, чтобы увидеть, что другие ответят.