C++ 定义一个调用其他函数的内联函数有意义吗?

C++ 定义一个调用其他函数的内联函数有意义吗?,c++,inline,C++,Inline,据我所知,内联函数是一种提高性能的优化,因此它应该像宏一样快速运行。内联函数的代码应该尽可能短 我想知道在内联函数中嵌入函数调用是否有意义。如果答案是肯定的,在哪种情况下,有哪些限制 实际上,我问这个问题是因为我看了一些人的代码,他们从内联函数调用函数,如“socket()”、“sendto()”和“memset()”;在我看来,它超越了内联函数的用途 注意:在我的代码中,没有使用任何对函数的条件调用,内联函数只是将参数传递给被调用的函数 我想知道在内联函数中嵌入函数调用是否有意义 当然有。将调

据我所知,内联函数是一种提高性能的优化,因此它应该像宏一样快速运行。内联函数的代码应该尽可能短

我想知道在内联函数中嵌入函数调用是否有意义。如果答案是肯定的,在哪种情况下,有哪些限制

实际上,我问这个问题是因为我看了一些人的代码,他们从内联函数调用函数,如“socket()”、“sendto()”和“memset()”;在我看来,它超越了内联函数的用途

注意:在我的代码中,没有使用任何对函数的条件调用,内联函数只是将参数传递给被调用的函数

我想知道在内联函数中嵌入函数调用是否有意义

当然有。将调用内联到您的函数仍然是一种优化,消除了该函数调用的成本,并允许在调用函数的上下文中进行进一步优化,无论它是否反过来调用其他函数

在哪种情况下,有哪些限制


我不知道你所说的“上下文”是什么意思;但是对于内联函数中可以执行的操作没有限制。声明函数
inline
的唯一语义效果是允许函数的多个相同定义,并且需要在使用该函数的任何翻译单元中定义。在所有其他方面,它与任何其他函数定义相同。

编译器将选择何时内联。而且,您应该避免以公开实现为代价进行过早优化

编译器可能能够优化正在调用的函数的转发。即使您不使用inline关键字,它也可以使用优化标志来实现这一点

使用
inline
关键字的时间是当您希望在多个项目中使用仅头文件而不必使用链接库时。实际上,这根本不是指“内联”,而是指“仅一个定义”,甚至在调用函数的编译单元之间

在任何情况下,您都应该查看以下wiki问题/答案:

< P>第一,在C++中,一个“内联”函数(一个在头文件中声明或标记为这样)只是对编译器的一个建议。编译器本身将决定是否将其内联

内联函数有三个原因:

  • 将另一轮变量推到堆栈上是非常昂贵的,正如在程序中分支到新的点一样
  • 有时我们可以对函数的中间部分进行局部优化(尽管我不指望!)
  • 将函数的定义放在头文件中(解决方法)
  • 以下面的例子为例

    void NonInlinable(int x);
    inline void Inline() { NonInlinable(10);}
    
    这对于内联非常有意义。我删除了1个函数调用,所以如果nonlinable非常快,那么这可能是一个巨大的加速。因此,无论我是否调用函数,我仍然希望内联调用

    现在再举一个例子:

     inline int Inline(int y) {return y/10;}
     //main
     ...
     int x = 5;
     int y = Inline(5);
     int z = x % 10;
    
    模运算和设计运算通常由同一条指令计算。一个非常好的编译器,可以在一条汇编指令中计算y和z!魔力

    所以在我看来,一个更好的问题是什么时候我不应该使用内联函数:

  • 当我想从声明中分离定义时(非常好的可读性实践,过早优化是万恶之源)
  • 当我想隐藏我的实现/使用良好的封装时

  • 这很有道理

    考虑一个由两个可能的执行分支组成的函数——当某些条件保持时(大部分时间)激活的快速路径和慢速路径

    将整个内容内联将导致代码的大小增加,但几乎没有什么好处。缓慢的路径复杂性可能会阻止编译器内联函数

    如果你把这条慢路变成一个单独的函数,那么就会有一个有趣的机会


    它可以内联条件和快速路径,而慢速路径仍然是函数调用。内联快速路径允许在大多数情况下避免函数调用开销。慢路径已经很慢,因此调用开销可以忽略。

    我看不出内联代码不能包含函数调用的先验原因

    撇开参数不谈,内联按原样插入代码行,从而减少调用开销并允许局部/特别优化

    例如,
    inline void MyInline(bool-Perform){if(Perform)memset();}
    在使用
    MyInline(false)
    调用时很可能会被跳过


    内联还可以允许内部函数调用的内联,从而产生更多(微)优化机会。

    按请求作为答案发布的注释:

    如果编写代码的人认为
    inline
    对性能有任何有意义的影响,那么他显然没有“做正确的事情”

    性能来自正确的算法选择和避免缓存未命中


    让人头疼的是那些可能在1991年起作用的幼稚的过早优化技术

    内联是一个建议,编译器可以随意忽略它。谢谢,但我知道这一点。我的问题是与内联函数相关的最佳实践,以及编写代码的人是否做了正确的事情。如果这些调用是有条件的,并且很少发生(因此最频繁的路径会绕过它们),这是非常有意义的。如果它们不是,根据函数(它们甚至可能是内联的;您无法通过查看源代码知道编译器将对其执行什么操作)的不同,这可能是有意义的。另外,您正在查看的代码可能不是最佳使用“内联”的最佳参考资料