gpt4 book ai didi

c++ - 模板函数+仿函数参数,为什么仿函数没有内联?

转载 作者:行者123 更新时间:2023-11-30 02:59:40 25 4
gpt4 key购买 nike

下面的代码执行速度快 4 倍,如果靠近“REPLACING WITH ..”行,仿函数 compare_swaps() 将被替换为对 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;
}

最佳答案

编译器看到一个函数指针,他不能真正确定它没有改变。我以前见过几次。解决该问题的方法是使用一个简单的包装器 struct:

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

特别是对于内置类型,您可能希望按值而不是按引用传递对象。对于内联函数,它可能没有太大区别,但如果函数未内联,通常会使情况变得更糟。

关于c++ - 模板函数+仿函数参数,为什么仿函数没有内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12718384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com