15

假设我的程序和代码中的某个地方有一个函数,该函数是通过函数指针调用的。如果编译器碰巧内联该函数会发生什么,或者编译器会意识到有一个函数指针分配给该函数并因此避免内联它。

4

4 回答 4

12

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

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

于 2013-02-07T10:50:26.967 回答
4

好吧,它肯定会奏效。我不知道内联如何防止这种情况。您只是有一些直接调用该函数的代码,并且它可能在那里内联,并且您有一些通过函数指针调用它的代码,就像一个常规函数一样。

于 2013-02-07T10:48:49.403 回答
3

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

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

于 2013-02-07T10:49:18.047 回答
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() 的调用成为直接调用,而不使用函数指针。

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

于 2013-02-07T11:17:42.510 回答