如果编译器内联通过函数指针调用的函数会发生什么

时间:2013-02-07 10:46:50

标签: c++ c compiler-construction

让我们说我的程序中有一个函数,在我的代码中的某个地方,该函数是通过函数指针调用的。如果编译器碰巧内联该函数会发生什么,或者编译器是否意识到有一个函数指针分配给该函数,从而避免内联函数。

4 个答案:

答案 0 :(得分:12)

当获取指向函数的指针时,编译器将为该函数生成一个外联体。仍然可以在其他呼叫站点内联函数。

请注意,标记为inline的函数必须在引用它的所有TU中都有一个定义,并且这些定义必须相同。这意味着在某些呼叫站点内联功能并将其保持在其他呼叫站点之外是完全安全的。

答案 1 :(得分:4)

嗯,一定会有用的。我没有看到内联会如何阻止这种情况。你只需要一些直接调用函数的代码,它可能会在那里内联,你有一些代码通过函数指针调用它,就像常规函数一样。

答案 2 :(得分:3)

使用函数指针没有理由阻止内联。内联是根据具体情况进行的,可以与通常的功能体一起存在。因此,函数可以在一个地方内联,并在另一个地方调用。

因此,编译器将内联它的位置并仍然为函数指针生成一个可调用函数。

答案 3 :(得分:2)

编译器不仅内联“函数的其他调用”,而且如果它足够了解实际使用的函数,它甚至可以通过函数指针内联调用,如下所示:

typedef void (*funcptr)();

void somefunc()
{
   ... do stuff here ... 
}

void indirection(funcptr *f)
{
   f();
}

void call_with_ptr()
{
    funcptr f = somefunc();
    for(int i = 0; i < 100; i++)
    {
       indirection(f);
    }
}

我有类似于此的代码,它内联了间接,并且在不使用函数指针的情况下调用somefunc()直接调用。

但是,当然,这假设编译器可以确定从代码中调用哪个函数 - 在这种情况下这是显而易见的,但如果涉及运行时决策,则可能不会这样做。