Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!

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

Вопрос: при каком варианте развития событий вызов функции будет быстрее? Сможет ли компилятор со знанием неизменяемости данных оптимизировать процесс таким образом, чтобы добиться минимального overhead?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2015, 00:04
Ответы с готовыми решениями:

работа через F5 быстрее, чем через Ctrl+F5
Прошу прощения за дурацкое название темы, сейчас соизволю объяснить все :) моя программа...

Указатели на функцию. Вызов функции через указатель
Вот у меня имеется функция int *f(int *) и имеется вот такой указатель int *(*f1)(int *) я...

Sort(), третий параметр: как sort() выбирает аргументы из переданной последовательности для переданной функции?
Вот sotr() 2 параметра - итераторы, а третий функцию. Допустим, моя функция сортирует список по...

Строка через указатель и через массив - в чем преимущества каждого подхода
Хотелось бы получить конкретный ответ на такой вопрос: в каком случае используется объявление...

3
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
29.04.2015, 00:21 2
Лучший ответ Сообщение было отмечено relationer как решение

Решение

вы под аргументов шаблона имеете ввиду агрумент, не являющийся типом? если так, то в этом случае становятся доступны кое-какие оптимизации.
если мембер - то чтобы обратится к нему, нужно смещаться относительно this, ведь для каждого инстанса он может быть свой и компилятор обязан генерить код для доступа к такому мемберу. для шаблона такого не надо. для всех инстансов указатель на функцию один и тот же. кроме этого, какой-нибудь хитрый оптимизатор вместо вызова через указатель может попробовать заинлайнить вызов, если посчитает нужным (имхо ).
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.04.2015, 00:27 3
Лучший ответ Сообщение было отмечено relationer как решение

Решение

рассмотрим примеры:

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
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
29.04.2015, 00:44 4
врятли во втором случае inline подстановку они будут делать. значение mFunc во время выполнения только известно. для каждого инстанса эти значения могут быть разные. только сверх простые примеры, когда оптимизатор прошарил весь код и понял, что используется одна и та же функция - только тогда. сомневаюсь что они так делают.
1
29.04.2015, 00:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2015, 00:44
Помогаю со студенческими работами здесь

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

Как вывести результат функции void через cout? Или передавать в функцию параметр типа string?
class tomat : public cveti { public: int ves = (rand() % 599 + 1); string an; void print()...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru