33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
|
|
1 | |
Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию?29.04.2015, 00:04. Показов 1422. Ответов 3
Метки нет (Все метки)
Здравствуйте!
Есть два варианта передачи некоторой переменной типа "указатель на функцию" в класс - через параметр шаблона и просто с помощью конструктора с сохранением в const-поле. Указатель на функцию не будет меняться. Вопрос: при каком варианте развития событий вызов функции будет быстрее? Сможет ли компилятор со знанием неизменяемости данных оптимизировать процесс таким образом, чтобы добиться минимального overhead?
0
|
29.04.2015, 00:04 | |
Ответы с готовыми решениями:
3
работа через F5 быстрее, чем через Ctrl+F5 Указатели на функцию. Вызов функции через указатель Sort(), третий параметр: как sort() выбирает аргументы из переданной последовательности для переданной функции? Строка через указатель и через массив - в чем преимущества каждого подхода |
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
(не нужно хранить член данных под указатель на функцию). для запуска можно задействовать статическую функцию член. и это - 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 | |
29.04.2015, 00:44 | |
Помогаю со студенческими работами здесь
4
Степень вывести через указатель,a десятичный логарифм через функцию рекуренционную Как вывести результат функции void через cout? Или передавать в функцию параметр типа string? Можно ли передать указатель на функцию как параметр другой функции? В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |