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

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

Войти
Регистрация
Восстановить пароль
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
#1

Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию? - C++

29.04.2015, 00:04. Просмотров 316. Ответов 3
Метки нет (Все метки)

Здравствуйте!

Есть два варианта передачи некоторой переменной типа "указатель на функцию" в класс - через параметр шаблона и просто с помощью конструктора с сохранением в const-поле. Указатель на функцию не будет меняться.

Вопрос: при каком варианте развития событий вызов функции будет быстрее? Сможет ли компилятор со знанием неизменяемости данных оптимизировать процесс таким образом, чтобы добиться минимального overhead?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2015, 00:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию? (C++):

Степень вывести через указатель,a десятичный логарифм через функцию рекуренционную - C++
Написать функции,где 3 натуральных числа a,b,c(a/b-десятичный логарифм).Чтобы степень вывести через указатель,a десятичный логарифм через...

Можно ли передать указатель на функцию как параметр другой функции? - C++
В общем, вопрос. Можно ли, допустим ... int fun1(int x) { ... ... ... return x*1000; }

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

Указатель на статический массив как параметр шаблона - C++
Добрый день. Необходимо параметр шаблона сделать указателем и передавать в него указатель на статический массив: template<size_t...

Написать функцию через указатель - C++
Написать функцию, которая принимает три параметра по адресу через указатель и находит максимальное значение. Функция не возвращает значение...

Как вызвать функцию через указатель? - C++
Добрый день. Всех с наступающим))Здоровье Счастье и бабок))) Подскажите как правильно сделать Тестовый рабочий пример struct AmiVar ...

3
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
29.04.2015, 00:21 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вы под аргументов шаблона имеете ввиду агрумент, не являющийся типом? если так, то в этом случае становятся доступны кое-какие оптимизации.
если мембер - то чтобы обратится к нему, нужно смещаться относительно this, ведь для каждого инстанса он может быть свой и компилятор обязан генерить код для доступа к такому мемберу. для шаблона такого не надо. для всех инстансов указатель на функцию один и тот же. кроме этого, какой-нибудь хитрый оптимизатор вместо вызова через указатель может попробовать заинлайнить вызов, если посчитает нужным (имхо ).
1
hoggy
6693 / 2875 / 494
Регистрация: 15.11.2014
Сообщений: 6,467
Завершенные тесты: 1
29.04.2015, 00:27 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
рассмотрим примеры:

http://rextester.com/QIVZ43446
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
31
32
33
34
35
36
37
//Title of this code
//g++  4.9.1
 
#include <iostream>
#include <type_traits>
 
void foo(){ std::cout<<"foo\n"; }
 
template<class F, F f> struct launcher
{
    static auto execute() -> typename std::result_of<F()>::type
    {
        return f();
    }
};
 
template<class F> struct executer
{
    executer(F f):mFunc(f){}
    
    auto execute()const -> typename std::result_of<F()>::type
    {
        return mFunc();
    }
    F mFunc;
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    launcher<decltype(&foo), foo>::execute();
    
    executer<decltype(&foo)> exe(foo);
    exe.execute();
}
в первом случае размер объекта получается меньше
(не нужно хранить член данных под указатель на функцию).
для запуска можно задействовать статическую функцию член.
и это - 100% inline подстановка.
то бишь никаких накладных расходов в рантайме.



во втором случае размер объекта становится больше,
нужно сохранять указатель на функцию в член данных.
соответственно, не получится сделать статическую функцию-член для запуска.

однако, сам вызов функции по указателю,
в релизе современные компиляторы научились оптимизировать,
выполняя inline подстановку вызова так же, как и в первом шаблоне.
2
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
29.04.2015, 00:44 #4
врятли во втором случае inline подстановку они будут делать. значение mFunc во время выполнения только известно. для каждого инстанса эти значения могут быть разные. только сверх простые примеры, когда оптимизатор прошарил весь код и понял, что используется одна и та же функция - только тогда. сомневаюсь что они так делают.
1
29.04.2015, 00:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2015, 00:44
Привет! Вот еще темы с ответами:

Как вызвать функцию через указатель? - C++
Привет всем! Помогите пожалуйста! Есть готовая рабочая программа, надо вызвать функцию через указатель. Никак не могу разобраться... =( ...

Не могу вызвать функцию через указатель - C++
Есть функция void matrixsqr(int **a, int N, int M) как ее вызвать через указатель на функцию Добавлено через 18 минут Неужели никто...

Почему не обнуляется указатель через функцию? - C++
В функцию передаю указатель на целое число, хочу удалить память а сам указатель установить в NULL. Но он не устанавливается. Если все...

Вызов через указатель на функцию-член - C++
Всем экспертам привет :) Разбавим раздел, так сказать. Задался тут таким вопросом: Есть класс, в котором объявлено поле типа...


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

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

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