Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
#1

Указатель на функцию - C++

30.10.2010, 16:54. Просмотров 340. Ответов 6
Метки нет (Все метки)

Проверял, что быстрее работает и столкнулся с дилеммой - по идее, ссылаться на функцию через указатель быстрей, чем просто вызывать ее, но тут получилось наоборот.
Хотя когда просто пользовался указателем(без функции) все было исправно(по времени).

Может подскажете в чем собственно дело.

Суть программы простая, кучу раз "зовем" функцию, и фиксируем время в миллисекундах, до и после.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <time.h>
#include <math.h>
#define PI 3.1415962
#define N 10000000
 
double (*aaa)(double);
 
double fff(double x)
{
    return sin(x);
}
 
int main()
{
    clock_t start,end;
    aaa = &fff;
    
        start = clock();
    for(int i=0;i<N;i++) (*aaa)(PI);
    end = clock();
    std::cout << end - start << std::endl;
    
        start = clock();
    for(int i=0;i<N;i++) fff(PI);
    end = clock();
    std::cout << end - start << std::endl;
    system("Pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2010, 16:54     Указатель на функцию
Посмотрите здесь:

С++ - указатель на функцию. C++
Указатель на функцию C++
C++ Указатель на функцию
Указатель на функцию C++
C++ Указатель на функцию
Указатель на функцию C++
C++ Указатель на функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
30.10.2010, 19:16     Указатель на функцию #2
Насчёт указателей на функции ничего не скажу, но вот число пи у тебя неправильно написано.
Используй M_PI .
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
30.10.2010, 19:35     Указатель на функцию #3
Скажу просто - неправильные у вас идеи. При обычном вызове по указателю дополнительные расходы составляют только затраты на чтение, но с учётом оптимизации дело другое: при непосредственном вызове функцию можно просто встроить в место вызова, что даёт экономию на операции вызова, а также на прологе и эпилоге.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
30.10.2010, 20:00     Указатель на функцию #4
Мда...
Значит, автор, слушай меня внимательно
Во-первых в экзешнике тело функции есть набор инструкций. У тебя ОДНА И ТА ЖЕ функция. Один набор инструкций. В экзешнике в ней нет безусовных переходов, то есть здесь всё чисто, она выполняется одинаково быстро, что в первом, что во втором случае. Я добавил в твой код такую строчку:
Код C++
1
2
printf ("= %x\n", aaa);

И увидел вывод:
Код C++
1
= 401390

ПОнял? По адресу 401390 расположена твоя функция fff

(Да, в экзешнике никаких имён. Только указатели на функцию. У тебя повторюсь НЕ ДВЕ ОДИНАКОВЫХ функции, а ОДНА)

Теперь дальше. Я так понял, ты замеряешь временное расстояние между началом и концом цикла. С эжтим не сталкивался, скажу только, что время это НЕ чистое, а грязное, ибо в системе существуют другие процессы и они вклиниваются в вызовы твоей функции и поэтому она вызывается неодинаково быстро в разных случаях. Это ты прочтёшь, а вот что ты увидеть можешь сам:

Вызывается она ИЗ РАЗНЫХ МЕСТ. Впервом случае она вызывается из адреса 401426
а во втором 401480 (это у меня на компьютере, у тебя результат может быть другим)

Понял, о чём я? Разница между 401426 и 401390 МЕНЬШЕ. чем между 401480 и 401390
Поэтому в первом случае функция вызывается быстрее, чем во втором (это мой компилятор так скомпилили, а у тебя по-другому, но думаю, мысль, понятна.)

Ща спопробую приложить скриншот отладчика и всё поймёшь
Миниатюры
Указатель на функцию  
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
30.10.2010, 20:15     Указатель на функцию #5
Видно плохо, но вот если чё ссыль на рисунок
ссылка удалена

Вот видишь по адресу 401390 и есть твоя функция (красным цветом)

Ну и ещё красным цветом выделены два адреса 401424 и 401480

Вот собсно и всё. Длина прыжков разная ну и время тоже разное

 Комментарий модератора 
Ссылки на файлообменники запрещены правилами форума.
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
31.10.2010, 02:20  [ТС]     Указатель на функцию #6
Цитата Сообщение от kravam Посмотреть сообщение
У тебя повторюсь НЕ ДВЕ ОДИНАКОВЫХ функции, а ОДНА
Это я специально и сделал, чтобы ничем "aaa" и "fff" не различались кроме способа вызова.


А за дизассемблер, kravam, больше спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2010, 06:01     Указатель на функцию
Еще ссылки по теме:

указатель на функцию C++
C++ Указатель на функцию, С++
Указатель на функцию C++
C++ Указатель в функцию
C++ Указатель на функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.10.2010, 06:01     Указатель на функцию #7
попробуй без разыменования aaa(PI)
Yandex
Объявления
31.10.2010, 06:01     Указатель на функцию
Ответ Создать тему
Опции темы

Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru