C / C ++编译器是否可以内联C-Callback函数?

时间:2011-03-13 16:25:26

标签: c++ c optimization compiler-optimization inlining

鉴于一个典型的函数将C-Functionpointer作为回调(如C-Stdlib qsort()),任何编译器都可以使用内联优化代码吗?我认为不可以,这是正确的吗?

int cmp(void* pa, void* pb) { /*...*/ }
int func() {
  int vec[1000];
  qsort(vec, 1000, sizeof(int), &cmp);
}

好的,qsort()是来自外部库的函数,但我认为即使LTO也不会有帮助,对吗?

但是,如果我在同一个编译单元中定义了my_qsort(),那么编译器是否可以内联?

int cmp(void* pa, void* pb) { /*...*/ }
void my_qsort(int* vec, int n, int sz, (void*)(void*,void*)) { /* ... */ }
int func() {
  int vec[1000];
  my_qsort(vec, 1000, sizeof(int), &cmp);
}

这有什么不同吗?我认为使用 C函数指针作为回调是阻止编译器内联的因素。正确的吗?

(我只想确保理解为什么我应该在C ++中使用 Functors

3 个答案:

答案 0 :(得分:7)

答案 1 :(得分:4)

是的,有编译器内联回调。对于在同一编译单元中定义的函数,GCC肯定可以这样做,并且可能在使用LTO时(我没有验证,但是原则上没有什么可以阻止这样的优化)。

但是,qsort()是否可以实现这是标准库的实现细节:任何标准库函数都可以作为inline函数提供 - 事实上,它们实际上可能被遮蔽通过类似函数的宏 - 因此,如果是这种情况,编译器可以自由生成带有对比较函数的内联调用的专用版本。

答案 2 :(得分:1)

你说的是你应该在C ++中使用仿函数而不是函数指针的多种原因之一。

如果编译器能够使用回调内联函数是相当复杂的,并且通常取决于各种情况。

在一些简单的例子中,编译器肯定可以内联调用,因为它能够确定将调用哪个函数。在其他程序中,要调用的函数可能取决于某些运行时参数,可能存在编译器无法检测到的别名以及优化程序正在使用的任何黑魔法。

相关问题