Функция шаблона + аргумент функтора, почему функтор не встроен?

Приведенный ниже код выполняется в 4 раза быстрее, если рядом со строкой «REPLACING WITH ..» функция fun_comaps () будет заменена прямой ссылкой на my_intcmp (). Видимо, косвенное использование не указывается. Зачем?

inline bool my_intcmp( const int & a, const int & b ) {
return a < b;
}template <class T, class compare>
void insertion_sort_3( T* first, T* last, compare compare_swaps ) {
// Count is 1?
if( 1 == (last - first) )
return;

for( T* it = first + 1; it != last; it ++ ) {
T val = *it;
T* jt;

for( jt = it; jt != first; jt -- ) {
// REPLACING WITH if( my_intcmp(val, *(jt - 1) ) gives 4x speedup, WHY?
if( compare_swaps(val, *(jt - 1)) ) {
*jt = *(jt - 1);
} else {
break;
}
}

*jt = val;
}
}

#define SIZE 100000
#define COUNT 4

int main() {
int myarr[ SIZE ];

srand( time(NULL) );

int n = COUNT;
while( n-- ) {
for( int i = 0; i < SIZE; i ++ )
myarr[ i ] = rand() % 20000;

insertion_sort_3( myarr, myarr + SIZE, my_intcmp );
}

return 0;
}

1

Решение

Компилятор видит указатель на функцию, которую он не может определить как неизменный. Я видел это пару раз раньше. Решение проблемы заключается в использовании простой оболочки struct:

struct my_intcmp_wrapper
{
bool operator()(int v0, int v1) const {
return my_intcmp(v0, v1);
}
};

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector