2016-03-29 32 views
-2

我想知道编译器是否足够聪明以通过函数指针内联调用。通过函数指针优化和内联调用

如果我用任何-Os或-O2编译使用gcc 4.8,那么编译器会将apply1和apply2内联到main中,但另外对于apply2它将通过函数指针移除间接调用,并将add1内联到代码中。在apply1中它没有。一般情况下,声明我的函数静态的情况似乎是允许这种优化的,但非静态不会。

是否有任何解释性的差异?

这现在主要是为了好奇,但是由于我需要写一些高性能的代码,所以想了解什么可能会引发这种差异。

虽然这段代码是C,但是如果我编译为C++,也会得到相同的结果。

#include <stdio.h> 

int add1(int a) 
{ 
    return a + 1; 
} 

void apply1(int lower, int upper, int (* func)(int)) 
{ 
    for (int i = lower; i < upper; i++) 
    { 
     printf("%d = %d\n", i, func(i)); 
    } 
} 

static void apply2(int lower, int upper, int (* func)(int)) 
{ 
    for (int i = lower; i < upper; i++) 
    { 
     printf("%d = %d\n", i, func(i)); 
    } 
} 

int main() 
{ 
    apply1(0, 10, add1); 
    apply2(0, 10, add1); 
} 
+0

看看汇编代码。 [在任何情况下,微优化都无济于事,因为间接调用func的开销将被printf的开销隐藏起来。] –

+0

函数指针的内联是LTO中涉及的主要功能之一。 – o11c

回答

1

apply1,是由德不是静态的当前转换单元之外的文件可见,可以令人信服地从翻译单元外面叫它是否会与其他文件进行链接。因此,可以使用func参数的add1以外的值调用它,因此优化无效。