假设我有一个接受函数指针的函数:
int funct(double (*f)(double));
我会将其传递给一个实际上不做任何事情的函数:
double g(double a) { return 1.0;}
//...
funct(g);
编译器会优化对 g
的调用吗?还是这仍然会有开销?如果确实有开销,那么这个开销有多大?开销足够大到值得重载函数来接收函数指针和常量值吗?
假设我有一个接受函数指针的函数:
int funct(double (*f)(double));
我会将其传递给一个实际上不做任何事情的函数:
double g(double a) { return 1.0;}
//...
funct(g);
编译器会优化对 g
的调用吗?还是这仍然会有开销?如果确实有开销,那么这个开销有多大?开销足够大到值得重载函数来接收函数指针和常量值吗?
-findirect-inlining
来内联和优化已知函数指针。这仅在GCC也知道使用该指针的所有代码时才有效。qsort
将无法从此优化中受益。qsort的编译机器码在库中,它期望一个函数指针,编译器无法更改这一点。operator()
的对象,并且可以接受函数指针。传递函数对象将允许C ++编译器内联和优化几乎所有相关代码。int funct(int x1, int x2, int x3, double (*f)(double));
这个函数只接受两个参数 f
funct(rand(), rand(), rand(), g1);
...
funct(rand(), rand(), rand(), g2);
int funct_g1(int x1, int x2, int x3);
int funct_g2(int x1, int x2, int x3);
没有函数指针参数,直接调用 g1
和 g2
的情况下进行优化。(当然,这种优化与函数指针无关,可以应用于任何仅使用一小组固定参数的函数参数。实际上,这类似于 C++ 模板。)但我不知道有哪些编译器会执行这样的操作。
编译器可能不会对其进行优化,因为函数funct
可以接收指向不同函数的指针,而不仅仅是g
,它们也不必来自同一编译单元(因此编译器不能假设它知道所有可能的调用)。
您需要对代码进行基准测试,以确定您所说的优化是否必要,如果确实需要-就去做。但是,除非funct
经常调用g
,否则我不认为这很重要。
funct
可能会成为另一个文件中一个类的一部分(并且该类中许多不同的方法将使用funct
)。GCC能够进行优化吗?不幸的是,由于性能方面对此代码足够敏感,我必须思考它(g
可能会被调用超过几十万次)。 - Andrew Spott