【问题标题】:Is function defined in class always inline?类中定义的函数总是内联吗?
【发布时间】:2015-10-27 01:28:15
【问题描述】:

根据某些书籍,类中定义的函数(以及标题中的定义)始终是内联的。真的吗?

我们如何使用测试应用创建这样的场景?

【问题讨论】:

  • 我们如何使用测试应用程序创建这样的场景? -- 你能澄清一下你的意思吗?显然,您可以在测试应用程序的类中定义一个函数。什么是测试应用测试?
  • 类函数(静态)总是内联的?给我的消息....
  • @MartinJames 什么静态函数?

标签: c++ inline-functions


【解决方案1】:

在类定义中定义的函数被隐式标记为inline

[C++11: 9.3/2]: 成员函数可以在其类定义中定义 (8.4),在这种情况下,它是 内联 成员函数 (7.1.2),或者它可以在其外部定义类定义,如果它已被声明但未在其类定义中定义。 [..]

这与说它们将被内联不同。

inline 关键字对存储时长和链接要求有影响,这些必须遵守。

[C++11: 7.1.2/2]: 带有inline 说明符的函数声明(8.3.5、9.3、11.3)声明了一个内联函数。 inline 说明符向实现表明,在调用点对函数体进行内联替换优于通常的函数调用机制。在调用点执行此内联替换不需要实现;但是,即使省略了这个内联替换,7.1.2 中定义的内联函数的其他规则仍应遵守。

但是,如今,您的编译器将根据自己的指标来决定是否对函数进行物理内联,而不是基于 inline 关键字的存在与否(因为,坦率地说,现在编译器最了解) .

我不知道您想到的是什么“测试应用程序”,但代码中的一个示例非常简单:

struct T
{
   void foo() {}  // implicitly `inline`
};

【讨论】:

    【解决方案2】:

    是的,确实如此,类中定义的成员函数是隐式声明为内联的。但是inline 只是你给编译器的一个建议。编译器可以忽略它。

    如果你想看看不同场景会发生什么,你可以阅读汇编器

    【讨论】:

    • 关键字inline 不仅仅用于内联。它还告诉编译器这个函数可以在不同的翻译单元中有多个定义。如果我们考虑该属性,您确定类方法总是声明为 inline 吗?
    • 编译器不能“忽略”inline 关键字。但它可能不会使用它的存在或不存在来确定函数是否被物理内联。 (其他事情肯定会发生。)
    • @KABoissonneault 是的,我们确定
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多