![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kgycpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.2.2009 Репутация: нет Всего: нет |
Visual C++ 2008. Очень странно. Передаю в рекурсивную функцию параметр по значению, выходит один результат, по ссылке - другой.
По моему компилятор не корректно работает.
Это сообщение отредактировал(а) Daevaorn - 11.2.2009, 09:04 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
В случае передачи по ссылке первый раз deep = 9, рекурсивная функция выполнится 10 раз, на выходе deep = 0;
Остальные 1999 раз deep = 0, рекурсивная функция выполнится 1 раз, итого 2009 раз. В случае передачи по значению deep не меняется, рекурсия 10 раз при каждом вызове. итого 20000 раз. Внешний цикл умножет всё на 100000. |
|||
|
||||
| kgycpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.2.2009 Репутация: нет Всего: нет |
Точно! Фигурные скобки на 1 строчку выше поставил, чем нужно.
Изменил: for( i = 100000 ; i ; --i) { deep = N - 1 ; for( j = 2000 ; j ; --j) Recursive_pure_via_reference( deep) ; } На: for( i = 100000 ; i ; --i) for( j = 2000 ; j ; --j) { deep = N - 1 ; Recursive_pure_via_reference( deep) ; } Ситуация казалась на столько очевидной, что я неудосужился воспользоваться трассировкой... Спасибо! Интересный факт: void Recursive_pure_via_reference( int & k) выполняется за 8 сек. А void Recursive_pure_via_reference( int k) за 4 сек. Значит, действительно, для рекурсивной функции аргумент_ссылка - это не алиас переменной, а - замаскированный указатель! Алиасом он будет только если функция встраивается (inline), а для рекурсивной функции это не возможно... P.S.: Тему закрою через 18 часов. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
возможно ;) Добавлено через 22 секунды только смотри не опоздай |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ссылка всегда "замаскированный указатель", а не только в рекурсивных функциях.
|
|||
|
||||
| kgycpp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.2.2009 Репутация: нет Всего: нет |
что это за компилятор у Вас раз такие результаты ?! ======================================================================= Использую VS 2008. Прилагаю исходник. Можно убедиться на ПРАКТИКЕ, что это так. Предполагаю, что в любом компиляторе будет тоже самое. Сам недавно открыл для себя эту тему. До этого считал, что передача по ссылке - самый быстрый способ... Для встроенных типов передача по ссылке эффективнее только для ВСТРАИВАЕМЫХ функций. Для обычных функций это не возможно - передается УКАЗАТЕЛЬ вместо ссылки (с семантикой и синтаксисом ссылки)! В книжках слишком идеализуруют ситуацию. На форумах куча споров на эту тему... Хотя, не могу дать 100% гарантию! Это сообщение отредактировал(а) kgycpp - 11.2.2009, 15:58 Присоединённый файл ( Кол-во скачиваний: 5 )
val_ref.cpp 0,82 Kb |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
попробовал на gcc 3.4.2 , увеличил диапазон цикла и в результате 69 / 66. Да не в пользу ссылки, но .. попробуйте с любым другим типом , размер которoго не совпадает с int (хотя бы char и double) - результаты будут противоположные. Добавлено через 7 минут и 35 секунд
Зато во втором случае делается копия объекта.. Это сообщение отредактировал(а) mes - 11.2.2009, 16:40 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |