2016-10-29 2 views
1

У меня есть два вопросаПонимание функции указателя синтаксиса в C++

  1. ли оба этих деклараций setEvalFunction эквивалентных для using EvalFunctionPtr = T (*)(const std::vector<T>&);?

    a) void setEvalFunction(const EvalFunctionPtr& evalFunc); 
    
    b) void setEvalFunction(T (* const &evalFunc)(const std::vector<T>&)); 
    
  2. Какова разница между следующими параметрами (так как, кажется, работает хорошо).

    a) T (* const &evalFunc)(const std::vector<T>&) 
    
    b) T (* const &evalFunc)(const std::vector<T>&)& 
    

Я хочу иметь что-то эквивалентное 1 а), т.е. передавая ссылку на постоянная указатель на функции, но без использования некоторого дополнительного определения как using EvalFunctionPtr = ....

+0

Почему бы не использовать 'std :: function'? –

+1

Я не думаю, что вам нужно беспокоиться о ссылке вообще. Это 'const', поэтому вы не можете его изменить, и стоимость передачи указателя функции должна быть такой же, как передача ссылки на указатель функции. – user4581301

+0

Я не использую функцию std: function, потому что она медленнее.Передача значения указателя функции передает 64-битное целое число (в моем случае 64-битной системы), что не совпадает с передачей ссылки на указатель функции, так как ссылка применяется компилятором и занимает нулевое время во время выполнения. Но копия целого занимает время, не так ли? – xamid

ответ

1
  1. ли оба этих деклараций setEvalFunction эквивалент

Да.

  1. В чем разница между следующими параметрами (так как оба кажутся хорошо работающими).

Я считаю, что 2. б) R (* const & fptr)(/*args*/)& плохо сформированный, так как (не являющийся член) указатель функции не может иметь реф-классификатор, который является то, что конечным & обозначает. Однако, возможно, из-за ошибки компилятора мой GCC принимает его и анализирует его так же, как R (* const & fptr)(/*args*/). EDIT: clang правильно отказывается компилировать его.

Я хочу иметь что-то эквивалентное 1 а), т.е. передавая ссылку на постоянная указатель на функции, но без использования некоторого дополнительного определения, как с помощью EvalFunctionPtr = ....

Это вполне подходящее описание 1. б).

Передача значения указателя функции проходит 64-битное целое число (в моем случае 64-битной системы), которая не является таким же, как передавая ссылку указателя функции, так как ссылка, применяемый компилятор и занимает нулевое время во время выполнения. Но копия целого занимает время, не так ли?

Передача справки не занимает нулевого времени во время выполнения. На самом деле, передавая ссылочный аргумент функции практически копирования (вероятно, 64 бита в вашем случае) адрес указателя и разыменования его (если вы на самом деле доступ ссылки), что больше, чем просто копирование в случае прохождения указатель по значению. Если функция была расширена встроенным оптимизатором, то, вероятно, нет никакой разницы в любом случае.

+0

При создании тестов производительности я получаю разные результаты. например делая цикл for 10 раз, каждый раз делая 10000000 раз ссылаясь, копируя и ничего, кроме цикла for (over volatile int), а затем суммируя временные интервалы, полученные с помощью chrono :: stable_clock :: now(), я получаю например : 'В целом: применяется 205425 мкс, взятое для справки. В целом: применяется 220498 мкс для копирования. В целом: 198125 мкс для петли. В целом: применяется 196480 мкс для справки. В целом: применяется 220580 мкс для копирования. В целом: 197941 мкс для for-loop.' Как может быть такая разница? – xamid

+0

Мне говорили о нулевой производительности ссылок помощником в университете, который консультирует часть реализации C++ моей магистерской диссертации. Я думал, что могу просто доверять ему, и, согласно моим тестам, кажется, что он прав. Тем не менее, я действительно не нахожу статью, в которой говорится, что .. Если вы хотите мой тест, вы можете найти его здесь [https://dl.dropboxusercontent.com/u/4954653/RWTH/cpp/refPerformanceTest.txt) , – xamid

+0

'R (* const & fptr) (/ * args * /) &' плохо сформирован, но не пытается объявить ссылку на ссылку. Второй '&' является ref-квалификатором. –

Смежные вопросы