Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача по значению и по ссылке дают разный резул, Передача по значению и по ссылке дают ра 
:(
    Опции темы
kgycpp
Дата 11.2.2009, 08:02 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.2.2009

Репутация: нет
Всего: нет



Visual C++ 2008. Очень странно. Передаю в рекурсивную функцию параметр по значению, выходит один результат, по ссылке - другой.
По моему компилятор не корректно работает.



Код

#include<iostream>
#include<time.h>

using namespace std ;

const int        N = 10 ;

static long long        stat_counter = 0    ;



void Recursive_pure_via_reference( int & k)    // Почему-то делается 200900000  итераций !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//void Recursive_pure_via_reference( int  k)    // А в этом случае    2000000000 итераций
    {
    ++ ::stat_counter ;

        if( !k)
            {
    return;
            }
    --k ;
    Recursive_pure_via_reference( k) ;
    }



void main()
{
    register int    i , j ;

    ::stat_counter = 0 ;
    int        deep = N - 1 ;

    clock_t        time_start        ,
                time_finish        ;

    time_start = clock();

    cout<< '\n'<< "start..." ;
    for( i = 100000  ;  i  ;  --i)
        {
        deep = N - 1 ;
        for( j = 2000  ;  j  ;  --j)
            Recursive_pure_via_reference( deep) ;
        }

    time_finish = clock() ;

    cout<< '\n'<< "STAT_COUNTER =" << stat_counter
        << "    TIME =" <<    (double)((time_finish - time_start) / CLOCKS_PER_SEC) ;
    cin.get() ;
}


Это сообщение отредактировал(а) Daevaorn - 11.2.2009, 09:04
PM MAIL   Вверх
math64
Дата 11.2.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



В случае передачи по ссылке первый раз deep = 9, рекурсивная функция выполнится 10 раз, на выходе deep = 0;
Остальные 1999 раз deep = 0, рекурсивная функция выполнится 1 раз, итого 2009 раз.
В случае передачи по значению deep не меняется, рекурсия 10 раз при каждом вызове. итого 20000 раз.
Внешний цикл умножет всё на 100000. 
PM   Вверх
kgycpp
Дата 11.2.2009, 10:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 часов.

PM MAIL   Вверх
vinter
Дата 11.2.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(kgycpp @  11.2.2009,  11:52 Найти цитируемый пост)
 а для рекурсивной функции это не возможно

возможно ;)

Добавлено через 22 секунды
Цитата(kgycpp @  11.2.2009,  11:52 Найти цитируемый пост)
P.S.: Тему закрою через 18 часов.

только смотри не опоздай  smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 11.2.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(kgycpp @  11.2.2009,  09:52 Найти цитируемый пост)
Интересный факт:   void Recursive_pure_via_reference( int & k)    выполняется за 8 сек.
А void Recursive_pure_via_reference( int  k)    за 4 сек.

что это за компилятор у Вас раз такие результаты ?!  smile 


Это сообщение отредактировал(а) mes - 11.2.2009, 11:29


--------------------
PM MAIL WWW   Вверх
math64
Дата 11.2.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Ссылка всегда "замаскированный указатель", а не только в рекурсивных функциях.
PM   Вверх
kgycpp
Дата 11.2.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.2.2009

Репутация: нет
Всего: нет



Цитата(kgycpp @  11.2.2009,  09:52 Найти цитируемый пост)
Интересный факт:   void Recursive_pure_via_reference( int & k)    выполняется за 8 сек.
А void Recursive_pure_via_reference( int  k)    за 4 сек.

что это за компилятор у Вас раз такие результаты ?!  smile

=======================================================================

Использую VS 2008. 

Прилагаю исходник. Можно убедиться на ПРАКТИКЕ, что это так.

Предполагаю, что в любом компиляторе будет тоже самое.

Сам недавно открыл для себя эту тему. До этого считал, что передача по ссылке - самый быстрый способ...

Для встроенных типов передача по ссылке эффективнее только для ВСТРАИВАЕМЫХ функций. Для обычных функций это не возможно - передается УКАЗАТЕЛЬ вместо ссылки (с семантикой и синтаксисом ссылки)!

В книжках слишком идеализуруют ситуацию.

На форумах куча споров на эту тему...

Хотя, не могу дать 100% гарантию!



Это сообщение отредактировал(а) kgycpp - 11.2.2009, 15:58

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  val_ref.cpp 0,82 Kb
PM MAIL   Вверх
mes
Дата 11.2.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(kgycpp @  11.2.2009,  14:50 Найти цитируемый пост)
Прилагаю исходник. Можно убедиться на ПРАКТИКЕ, что это так.

попробовал на gcc 3.4.2  , увеличил  диапазон цикла и в результате 69 / 66. Да не в пользу ссылки, но ..
попробуйте с любым другим типом , размер которoго не совпадает с int (хотя бы char и double) - результаты будут противоположные.

Добавлено через 7 минут и 35 секунд
Цитата(kgycpp @  11.2.2009,  14:50 Найти цитируемый пост)
Для обычных функций это не возможно - передается УКАЗАТЕЛЬ вместо ссылки (с семантикой и синтаксисом ссылки)!

Зато во втором случае делается копия объекта.. 

Это сообщение отредактировал(а) mes - 11.2.2009, 16:40


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.