“inline”关键字在C中有什么用途?

“inline”关键字在C中有什么用途?,c,inline,c99,C,Inline,C99,我在stackoverflow中读到了几个关于C语言内联的问题,但仍然不清楚 static inline void f(void){}与static void f(void){}没有实际区别 代码> C中的内联空格F(空隙){} /Case>不作为C++方式工作。它在C语言中是如何工作的 extern内联void f(void)的实际作用做什么 我从来没有在我的C程序中真正发现使用inline关键字,当我在其他人的代码中看到这个关键字时,它几乎总是静态inline,在这个函数中,我只看到静态一个

我在stackoverflow中读到了几个关于C语言内联的问题,但仍然不清楚

  • static inline void f(void){}
    static void f(void){}
    没有实际区别
  • <>代码> C中的内联空格F(空隙){} /Case>不作为C++方式工作。它在C语言中是如何工作的
  • extern内联void f(void)的实际作用做什么

  • 我从来没有在我的C程序中真正发现使用
    inline
    关键字,当我在其他人的代码中看到这个关键字时,它几乎总是
    静态inline
    ,在这个函数中,我只看到
    静态

    一个所有声明(包括定义)都提到inline而从不使用extern的函数。
    同一翻译单元中必须有一个定义。标准将其称为内联定义。
    不会发出独立的目标代码,因此无法从其他翻译单元调用此定义

    在本例中,所有声明和定义都使用内联而不是外部:

    // a declaration mentioning inline     
    inline int max(int a, int b);
    
    // a definition mentioning inline  
    inline int max(int a, int b) {  
      return a > b ? a : b;  
    }
    

    是一个参考,它可以让您更清楚地了解C中的内联函数以及内联和外部函数的用法

    来自C11规范中的6.7.4功能说明符

    6使用内联函数说明符声明的函数是内联函数 功能。使函数成为内联函数意味着调用 函数必须尽可能快。138)在多大程度上 这些建议是有效的 已定义实施.139)

    138)例如,通过使用常规函数调用的替代方法 机制,例如内联替换。内联替换不可用 文本替换,也不会创建新功能。所以,, 例如,在函数体中使用的宏的展开 函数使用它在函数体上的定义 出现,而不是调用函数的位置;和标识符是指 到主体出现的范围中的声明。同样地 函数只有一个地址,而不管内联地址的数量如何 除外部 定义

    139)例如,一个实现可能 从不执行内联替换,或者可能只执行内联替换 内联声明范围内调用的替换

    它建议编译器广泛使用此函数,并要求在调用此函数时优先考虑速度。但对于现代智能编译器,这可能或多或少是无关紧要的,因为编译器可以决定函数是否应该内联,并且可以忽略用户的内联请求,因为现代编译器可以非常有效地决定如何调用函数

    static内联void f(void){}
    static没有实际区别
    void f(void){}

    因此,对现代编译器来说,大多数情况下都是这样。任何编译器都不存在实际/可观察的输出差异

    <代码>在C中内联空f(空隙){} /CONT>不作为C++方式工作。怎么样 在C工作

    任何地方都是内联函数,C++中必须是内联的,链接器不抱怨多个定义错误(定义必须相同)。p> 外部内联void f(void)实际上是什么;是吗

    这将提供到
    f
    的外部链接。由于
    f
    可能存在于其他编译单元中,编译器可能会选择不同的调用机制来加速调用,或者可能会完全忽略
    内联

    作为“内联”一词,在“行”中添加此关键字会在运行时影响程序,当编译程序时,函数内部编写的代码粘贴在函数调用下面,因为函数调用比内联代码更昂贵,所以这优化了代码。 所以 静态内联void f(void){}和静态void f(void){},在这个内联关键字中,do在运行时会有所不同。但当函数有太多的代码行时,它不会影响运行时。 如果在函数之前添加static,则函数的生命周期就是整个程序的生命周期。该函数的使用仅限于该文件。
    要了解extern,您可以参考-

    C代码可以通过两种方式进行优化:代码大小和执行时间

    内联函数: 说,

    通过内联声明函数,您可以指示GCC更快地调用该函数。GCC实现这一点的一种方法是将该函数的代码集成到其调用者的代码中。这通过消除函数调用开销使执行更快;此外,如果任何实际参数值是常量,那么它们的已知值可能允许在编译时进行简化,因此不需要包含所有内联函数的代码。对代码大小的影响不太可预测;根据具体情况,使用函数内联的目标代码可能更大或更小

    因此,它告诉编译器将函数构建到使用它的代码中,以提高执行时间

    如果您声明了一些小功能,如设置/清除标志或某些位切换,这些功能重复执行,
    inline
    ,它可能会在时间上产生很大的性能差异,但代价是代码大小


    非静态内联和静态内联 再次提到,

    当内联函数不是静态函数时,编译器必须假设可能有来自其他源文件的调用;由于全局符号在任何程序中只能定义一次,因此函数不能在其他源文件中定义,因此其中的调用无法集成。因此,非静态内联函数总是以通常的方式自行编译


    外部内联? 再说一遍,这一切都说明了:

    如果在fu中同时指定内联和外部