C++ 如何确定C++;内联函数?

C++ 如何确定C++;内联函数?,c++,inline,detection,C++,Inline,Detection,我有下面的代码 #include <iostream> using namespace std; inline void inlinefunc() { cout << "hello" << endl; } void func() { cout << "hello" << endl; } bool isInlineFunc(void (*f)()) { return (f == inlinefunc); } void print(

我有下面的代码

#include <iostream>

using namespace std;

inline void inlinefunc() { cout << "hello" << endl; }
void func() { cout << "hello" << endl; }

bool isInlineFunc(void (*f)()) { return (f == inlinefunc); }

void print(void (*f)()) {
    cout << (isInlineFunc(f)?"inline - ":"normal -");
    f();
}

int main() {
    void (*f)();

    f = inlinefunc;
    print(f);

    f = func;
    print(f);
}
#包括
使用名称空间std;

inline void inlinefunc(){cout您一般的意思是什么?是否希望有一个函数告诉您是否有另一个函数被声明为
inline
,这是无法实现的

还要注意的是,通过获取内联函数的地址,该实现实际上被迫具有该函数的一个离线实现。

您没有。
编译器基本上可以对内联函数做任何它想做的事情。函数可以在一个地方内联,而不能在另一个地方内联


如果你在考虑这个问题,你可能过早地优化了一些东西。

< P>你不能。根据C++标准[Basic,De.ODR](D指的是定义):

…如果D的定义满足所有这些要求,则 程序的行为应与D的定义相同。如果 D的定义不满足这些要求,那么行为 没有定义


获取函数的地址(内联或其他方式)必须产生与该函数只有一个定义时相同的行为。对于内联函数,这意味着地址相同。

一般来说,编译器可以应用它选择的任何优化,只要它不改变代码的语义


内联只是一种优化策略。“检测”函数是否内联将意味着语义取决于优化,这与上面的直接冲突。

你真的不能-即使使用GCC,函数也是用
\uuuu属性\uuuuuuuuu((总是\u内联))声明的
如果它们不符合编译器的标准,则不会内联,因为这些标准会提高程序的速度

内联函数可能会对性能产生严重的负面影响,而编译器几乎总是唯一处于正确位置的东西,可以知道是否存在这种情况。内联函数阻碍了CPU体系结构特性,如代码缓存和分支预测器,甚至阻碍了更低级别的特性,如指令解码缓存(和带宽)


简言之,任何现代CPU都会以惊人的速度完成一些事情,C/C++函数调用就在那里。分析函数调用开销几乎肯定会给出分析开销的误差度量。

让我们从“为什么你认为你想要?”您是否关心函数的代码是否真的是内联生成的,还是只关心
inline
是否在其定义中指定?我不太清楚您的意思,
inline
只是一个提示,如果编译器不想内联函数,它不会。无法检测是否有有趣的代码Action是内联的,您不应该真的需要内联。您想做什么?这使函数变得简单:总是返回FALSE。@Daniel R Hicks:Lol,但事实上,如果编译器认为合适,它仍然可以在任何地方内联该函数。@K-ballo:您自己的答案表示不是这样。@TomalakGeret'kal不是。它说它是被迫有一个离线实现,因此它可以有一个地址,而不是每次都被迫使用它。@Tomalak Geret'kal:如果你获取内联函数的地址,那么必须有一个离线实现,这不会阻止编译器内联它。事实上,编译器可以选择内联它想要的任何函数,它可以在在某些调用中使用相同的函数,但不是全部调用,等等。。。