| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Вернуть из функции std::map |
| Автор: Alca 23.9.2008, 11:30 | ||
| Вернуть из функции std::map оптимально быстрым способом? (без передачи std::map по ссылке или указателю в функцию)
|
| Автор: Alek86 23.9.2008, 11:38 | ||
|
| Автор: Torsten 23.9.2008, 12:00 |
ну остается 3 варианта : 1) вернуть по значению (крайне не эффективно) 2) вернуть по указателю (нужно сохранить обезательно указатель и не забыть потом очистить память) 3) по ссылке - тут сразу будет креш программы, да и компилятор должен предупредить о local variable. Наиболее удачен вариант возращать smart_ptr или принимать в smart_ptr, т.е. чтобы после возращения указателя функцией у нее у указателя появился хозяин. Ну и еще как извращенный вариант - сделать переменную static и возращать по ссылки или указателю. |
| Автор: Lazin 23.9.2008, 12:14 |
не обратил внимания, а что в этом плохого? |
| Автор: Alca 23.9.2008, 12:20 | ||||
Ничего.
Для меня так нагляднее. Всем спасибо. |
| Автор: maxim1000 23.9.2008, 18:49 |
измерения проводились? а то есть такая штука, как RVO - return value optimization, которая как раз и направлена на подобные ситуации... Добавлено через 56 секунд другео дело, что я не знаю, в каких конкретно случаях она осуществляется, и насколько можно на неё полагаться но с другой стороны, если на оптимизацию не полагаться, много чего из stl нужно выбросить... |
| Автор: Alca 25.9.2008, 14:24 | ||||||
Вот решил потестить:
Результат на лицо:
maxim1000, +1 |
| Автор: Lazin 25.9.2008, 14:35 |
| я думаю разница скорее из-за того, что во втором случае, создание TStringMap вынесено за цикл, а в первом происходит при каждой итерации |
| Автор: maxim1000 25.9.2008, 15:25 | ||
| и не только создание, а ещё и удаление предыдущего подобная оптимизация основывается на том, что для приёма результата работы функции создаётся объект прямо в той же строчке, т.е. его не нужно чистить от предыдущих данных тогда вместо (создание снаружи, создание внутри, присваивание) можно делать просто (создания снаружи) я бы предложил попробовать так:
Добавлено через 2 минуты и 51 секунду P.S. Честно говоря, я сам не знаю толком условия работы RVO, могу только предполагать |
| Автор: Alca 25.9.2008, 15:45 | ||
P.S. Вот вам и возврат по значению... |
| Автор: W4FhLF 25.9.2008, 16:21 |
| В данном случае копирование объекта вносит издержки равные 10% от времени исполнения(если, конечно, это именно копирование объекта). Но эти издержки будут расти с увеличением размера возвращаемого объекта. Alca, вощьми map размером не 10 элементов, а 1000, разница должна быть более ощутима. |
| Автор: maxim1000 25.9.2008, 16:22 |
| нннда... похоже, не сработала... Добавлено через 1 минуту и 49 секунд вообще, конечно, зря я написал std::cout - довольно медленная операция, можно было бы просто суммировать первые символы строк, чтобы поменьше влиять на статистику но всё равно разница остаётся... |
| Автор: Alca 25.9.2008, 17:16 | ||
map на 1000 элементов (убрал std::cout):
|
| Автор: J0ker 25.9.2008, 17:33 | ||||
RVO выполняется в случае
и случаях котоые могут быть к ему сведены |
| Автор: MTWizard 7.5.2009, 15:08 | ||
есть ещё NRVO |
| Автор: Alca 7.5.2009, 15:10 |
| NRVO - это чего такое? Добавлено через 2 минуты Нашел http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html |