![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Вернуть из функции std::map оптимально быстрым способом?
(без передачи std::map по ссылке или указателю в функцию)
|
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
ну остается 3 варианта : 1) вернуть по значению (крайне не эффективно) 2) вернуть по указателю (нужно сохранить обезательно указатель и не забыть потом очистить память) 3) по ссылке - тут сразу будет креш программы, да и компилятор должен предупредить о local variable. Наиболее удачен вариант возращать smart_ptr или принимать в smart_ptr, т.е. чтобы после возращения указателя функцией у нее у указателя появился хозяин. Ну и еще как извращенный вариант - сделать переменную static и возращать по ссылки или указателю. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
не обратил внимания, а что в этом плохого? |
|||
|
||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Ничего.
Для меня так нагляднее. Всем спасибо. Это сообщение отредактировал(а) Alca - 23.9.2008, 12:24 |
||||
|
|||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
измерения проводились? а то есть такая штука, как RVO - return value optimization, которая как раз и направлена на подобные ситуации... Добавлено через 56 секунд другео дело, что я не знаю, в каких конкретно случаях она осуществляется, и насколько можно на неё полагаться но с другой стороны, если на оптимизацию не полагаться, много чего из stl нужно выбросить... -------------------- qqq |
|||
|
||||
Alca |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Вот решил потестить:
Результат на лицо:
maxim1000, +1 |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я думаю разница скорее из-за того, что во втором случае, создание TStringMap вынесено за цикл, а в первом происходит при каждой итерации
|
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
и не только создание, а ещё и удаление предыдущего
подобная оптимизация основывается на том, что для приёма результата работы функции создаётся объект прямо в той же строчке, т.е. его не нужно чистить от предыдущих данных тогда вместо (создание снаружи, создание внутри, присваивание) можно делать просто (создания снаружи) я бы предложил попробовать так:
Добавлено через 2 минуты и 51 секунду P.S. Честно говоря, я сам не знаю толком условия работы RVO, могу только предполагать ![]() -------------------- qqq |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
P.S. Вот вам и возврат по значению... Это сообщение отредактировал(а) Alca - 25.9.2008, 15:53 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
В данном случае копирование объекта вносит издержки равные 10% от времени исполнения(если, конечно, это именно копирование объекта). Но эти издержки будут расти с увеличением размера возвращаемого объекта.
Alca, вощьми map размером не 10 элементов, а 1000, разница должна быть более ощутима. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
нннда... похоже, не сработала...
Добавлено через 1 минуту и 49 секунд вообще, конечно, зря я написал std::cout - довольно медленная операция, можно было бы просто суммировать первые символы строк, чтобы поменьше влиять на статистику но всё равно разница остаётся... -------------------- qqq |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
map на 1000 элементов (убрал std::cout):
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
MTWizard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: 3 Всего: 4 |
||||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
NRVO - это чего такое?
Добавлено через 2 минуты Нашел http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |