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

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

Восстановить пароль Регистрация
 
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
30.10.2010, 16:54     Указатель на функцию #1
Проверял, что быстрее работает и столкнулся с дилеммой - по идее, ссылаться на функцию через указатель быстрей, чем просто вызывать ее, но тут получилось наоборот.
Хотя когда просто пользовался указателем(без функции) все было исправно(по времени).

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

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

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++
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
30.10.2010, 19:16     Указатель на функцию #2
Насчёт указателей на функции ничего не скажу, но вот число пи у тебя неправильно написано.
Используй M_PI .
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
30.10.2010, 19:35     Указатель на функцию #3
Скажу просто - неправильные у вас идеи. При обычном вызове по указателю дополнительные расходы составляют только затраты на чтение, но с учётом оптимизации дело другое: при непосредственном вызове функцию можно просто встроить в место вызова, что даёт экономию на операции вызова, а также на прологе и эпилоге.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
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,265
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++

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

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

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