| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как из функции вернуть пустой std::map? |
| Автор: Alca 7.5.2009, 13:32 |
| Как из функции вернуть пустой std::map? |
| Автор: zim22 7.5.2009, 13:34 | ||
|
| Автор: azesmcar 7.5.2009, 13:36 | ||||
Alca
а зачем? вообще нехорошо это, по ссылке лучше передавать
опоздал |
| Автор: Alca 7.5.2009, 13:43 | ||||
| zim22, azesmcar, спасибо. Я так и делал, но колмпилер не хавал. Оказалось, что лажа была другом месте - в макросе.
|
| Автор: azesmcar 7.5.2009, 13:47 | ||
| Alca там в самом вопросе написано
Ну...надо так надо |
| Автор: Alca 7.5.2009, 13:52 | ||||
Там тесты есть. Я делал и так и так - результат сильно не отличается... Добавлено @ 13:53 azesmcar, попробуй сам потести. |
| Автор: azesmcar 7.5.2009, 13:59 |
ОК, проверю. Но тесты - это не гарантия. Гарантию дает С++ стандарт, где ясно сказано что при возвращении по значению - вызывается копирующий конструктор. Подсчетом ссылок мап не обладает, а значит данные будут скопированы. Что там натворит оптимизатор - сейчас посмотрю. Но писать код, который будет работать быстро/медленно в зависимости от оптимизатора по любому не стоит |
| Автор: azesmcar 7.5.2009, 14:19 | ||||
| Alca Вот и результаты тестов подоспели Все тесты проводились в релиз версии, на Visual Studio 2008 тестируемый код
Разница 1250 милисекунд. Более секунды. Оптимизатор вероятно просто заинлайнил эту функцию, потому никакой разницы нет при включенном оптимизаторе.. но другой компилятор может так не поступить, причем это даже зависит от функции, будет она инлайн, или нет..может сейчас она и будет, но добавим завтра в нее пару вызовов и получим в результате спад производительности. |
| Автор: Alca 7.5.2009, 14:22 | ||
| Можно даже тоже самое проделать с мапом более внушительного размера - будет тоже самое. Добавлено через 1 минуту и 41 секунду
|
| Автор: Alca 7.5.2009, 14:33 |
| |
| Автор: azesmcar 7.5.2009, 14:35 | ||||
если оптимизация отключена - влияет. см. тесты
|
| Автор: J0ker 7.5.2009, 17:12 | ||
это что-то новенькое инлайнинг выключите и посмотрите а вообще лучше матчасть поучите |
| Автор: Alca 7.5.2009, 17:38 | ||
А кто сказал что я собирался не инлайнить? |
| Автор: J0ker 7.5.2009, 17:59 |
а кто сказал, что компилятор учитывает ваше выраженнное вербально нежелание инлайнить |
| Автор: Alca 7.5.2009, 18:09 | ||
возьму на заметку |
| Автор: xvr 12.5.2009, 19:30 | ||||||||
А можно посмотреть как вызывалась функция foo2? У меня есть подозрение, что вызывалась она примерно так:
|
| Автор: azesmcar 12.5.2009, 20:14 | ||||
xvr
Как угодно..это совершенно не важно, хоть вот так
разница в скорости будет заметная. |
| Автор: xvr 13.5.2009, 09:50 | ||||||
Где? 688-688 В случае map<..> p=foo(); и map<...> p; ... p=foo(); разница может быть, так как в первом случае может сработать RVO, а во втором вряд ли |
| Автор: azesmcar 13.5.2009, 09:58 |
речь идет как раз о неоптимизированной версии. Писать код в надежде на оптимизатор на мой взгляд не очень хорошо. А так, с оптимизатором - без разницы. |
| Автор: xvr 13.5.2009, 13:16 | ||
Неа Но в данном случае я согласен, что лучше передавать map по ссылке - скорость будет максимальная вне зависимости от контекста применения (оптимизатор НЕ СМОЖЕТ сделать RVO для любого контекста) |
| Автор: azesmcar 13.5.2009, 13:44 | ||
я не говорил что ее надо отключать вот то что я имел ввиду или точнее На оптимизатор надейся, а сам не плошай |