【问题标题】:Usefulness of the "inline" feature“内联”功能的用处
【发布时间】:2010-07-09 12:33:43
【问题描述】:

关于内联有两点:

  • 如果编译器确定函数不能被内联,inline 关键字将被忽略。
  • 有一个编译器优化(在 Visual Studio 上,我不了解 GCC)告诉编译器在可能的情况下内联所有函数。

由此我得出结论,我永远不需要为内联而烦恼。我只需要为发布版本打开编译器优化。

或者有什么情况需要手动内联?

【问题讨论】:

  • 在某些情况下使用inline 关键字是必要的。它只是与内联优化没有太大关系
  • 我认为答案显然来自您的选择:当您想控制内联和不内联的内容时,您可能需要内联。
  • @Andrey:但大多数编译器无论如何都会很乐意内联。
  • @jalf:there are cases where using the inline keyword is necessary。请详细说明。
  • @Prasoon:如果你想在一个头文件中定义它是必要的,这样它就可以被内联到多个编译单元中。这是它唯一真正的目的:它为函数提供内联链接,允许出现多个相同的定义。

标签: c++


【解决方案1】:

inline 关键字有两个作用:

  • 它作为编译器执行内联优化的提示(这在现代编译器上基本上是无用的,无论是否使用关键字都可以积极内联)
  • 它告诉编译器/链接器忽略一个定义规则:inline'd 符号可以在多个翻译单元中定义(通常是因为它定义在头文件中,包含在多个文件中)。通常,这会导致链接器错误,但在您使用 inline 关键字时是允许的。

【讨论】:

  • 第一个项目符号是对我问题的直接回答。谢谢。
  • 并非在所有情况下都是如此。在共享库的情况下,inline 关键字至关重要。
【解决方案2】:

是的,如果您想将函数放入头文件中,并将该文件包含在多个翻译单元中。这其实是C++中inline的主要用途。

【讨论】:

  • 谢谢,我不知道可以使用 inline 来避免多个定义。但是,出于优化原因,是否还有任何原因可能会导致人们更喜欢手动内联?
  • @StackedCrooked:你不能“偏爱”其中一个。无论您是否将函数标记为inline,编译器都会内联。
【解决方案3】:

手动使用inline 可能对较旧的编译器或不太复杂的编译器(例如用于嵌入式开发的编译器)有用。如果您使用的是 Visual Studio,我认为您通常根本不需要使用 inline 关键字。

【讨论】:

    【解决方案4】:

    如果您想要从库中内联函数,内联也很有用。只有将函数的代码放在头文件中(需要内联),编译器才能内联函数。当然,是否内联函数仍然取决于编译器。

    【讨论】:

      【解决方案5】:

      在构建共享库时,inline 关键字会产生副作用。内联函数不会导出到符号表或库的二进制文件中。因此,inline 关键字在共享库方面至关重要,因为编译器无法内联导出的函数。另一方面,库的内联函数将始终被内联,因为它不以库的二进制形式存在。

      【讨论】:

        【解决方案6】:

        您可能不想在任何可能的地方内联。这可能会过多地增加二进制文件的大小。您可能有一些不常用的函数,内联可以在不显着增加位大小的情况下更快地运行

        【讨论】:

          【解决方案7】:

          这取决于你的环境和你想做什么,所以很难说什么时候内联是可取的。

          link 有一些关于内联的有趣读物。还有一些合理的建议(几乎可以归结为:避免这样做)

          【讨论】:

            【解决方案8】:

            在线阅读 Herb Sutters cmets:
            http://www.gotw.ca/gotw/033.htm

            【讨论】:

              猜你喜欢
              • 2020-08-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-24
              • 1970-01-01
              • 2019-04-24
              • 2020-08-24
              相关资源
              最近更新 更多