Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

30.10.2010, 16:54. Просмотров 363. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2010, 16:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на функцию (C++):

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель - C++
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Передать в неуправляемую функцию указатель на указатель - C++
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

Указатель на функцию возвращающую указатель - C++
Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр...

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

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

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

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

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

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

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

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

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

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

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

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


А за дизассемблер, kravam, больше спасибо.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2010, 06:01 #7
попробуй без разыменования aaa(PI)
0
31.10.2010, 06:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2010, 06:01
Привет! Вот еще темы с ответами:

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) - C++
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. void Open() // из этой функции вернуть...

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? - C++
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru