And*_*ott 17 c++ optimization function-pointers
假设我有一个带函数指针的函数:
int funct(double (*f)(double));
Run Code Online (Sandbox Code Playgroud)
我传给它一个实际上没有做任何事情的函数:
double g(double a) { return 1.0;}
//...
funct(g);
Run Code Online (Sandbox Code Playgroud)
编译器会优化调用g吗?或者这还有开销吗?如果确实有开销,多少钱?足够值得重载函数来接收函数指针和常量值吗?
Zan*_*ynx 17
较新版本的GCC(4.4及更高版本)可以使用该选项内联和优化已知函数指针-findirect-inlining.这只适用于GCC也知道使用指针的所有代码.
例如,C库函数qsort将不会从这个优化中受益.qsort的编译机器代码在库中,它需要一个函数指针,编译器不能改变它.
但是,如果您有自己的qsort实现并将其放在头文件中或使用了非常新的GCC链接时优化功能,那么GCC 将能够获取您的调用代码,指向的函数和您的qsort源代码并将它们编译在一起,针对您的数据类型和比较函数进行了优化.
现在,唯一真正重要的是函数调用开销远大于函数本身.在你的函数示例中没有做任何事情,使用函数指针是一个严重的开销.在我的qsort比较示例中,函数指针调用也非常昂贵.但在其他一些应用程序,如Windows事件派遣,它几乎不重要.
由于您使用的是C++,因此您应该学习模板.模板函数可以接受一个所谓的function object实现这只是一个对象operator() ,并可以接受函数指针.传递函数对象将允许C++编译器内联和优化几乎所有涉及的代码.