Возврат контейнера

0

Некоторое время я играю с работой, и я все еще не уверен, какое лучшее решение.

Я прочитал много статей, а также сделал тесты производительности:

Например, возьмите Контейнер (например, вектор строк) с большим количеством элементов. Копирование было бы очень дорогостоящим. Поэтому возвращение его в качестве справочника было бы хорошим решением.

//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, но как? Или есть другие решения?

  • 3
    Q2 - Это НЕ хорошее решение, потому что вы в конечном итоге испортите управление памятью. Если ваш vector<string> vec не является статическим / глобальным, как действителен адрес, если вы хотите использовать его где-то еще? Вы должны были использовать std::shared_ptr<> . Вопрос 1 - Я полагаю, что по этому поводу будет много противоречивых мнений, поскольку вы затронули очень распространенную и в то же время чувствительную область управления памятью на C / C ++. Я буду ждать, чтобы увидеть, что другие ответят.
  • 2
    Не могли бы вы показать свой контрольный код (и результат)?
Показать ещё 1 комментарий
Теги:
c++11
return-value

3 ответа

1

Для getter просто верните ссылку (const).

Чтобы построить вектор (начиная с С++ 11), вернитесь по значению (и в худшем случае у вас есть движение).

  • 0
    но почему это так медленно в VS2013? Как насчет параметров. void function (vector <string> & vec) {...} также следует избегать ссылок?
0

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

Вполне возможно, что std :: map будет действовать совершенно иначе, чем std :: vector, и будет быстрее, например, на платформе Windows.

Если вам нужны самые быстрые методы на обеих платформах, я боюсь, что вам понадобятся команды препроцессора.

0

В С++ 11, если это не общий объект, вы можете воспользоваться конструктором move, просто сделав:

vector<string> GetVector()
{ 
   // do something
   return vec;
}
  • 0
    поэтому возвращаемое значение автоматически использует конструктор перемещения? Это было именно то, что я делал в VS2013 для Windows, это было очень медленно. но это было быстро на OS-X. Насколько я знаю оба поддержали c ++ 11
  • 0
    да, это автоматически, вы можете принудительно сделать это, выполнив std :: move (vec);
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню