当方法体在头文件中时是否强制内联?

时间:2015-05-20 13:15:43

标签: c++ inline

我知道inline关键字只是编译器的提示,而不是强制(除非在MSVC中使用__forceinline)。

在标题中声明内联函数时是否也是这种情况?编译器在哪个编译单元中放置代码?

3 个答案:

答案 0 :(得分:2)

inline不仅仅是对编译器的暗示。

内联函数可以在多个翻译单元中定义,所有这些定义都具有相同的类型,地址和定义。

如果在标题中定义了一个函数,则必须将其声明为inline,否则当它包含在多个翻译单元中时,它将违反一个定义规则。

内联函数是:

  1. 可以使用关键字inline
  2. 内联声明全局范围内的函数
  3. 完全在class / struct / union定义中定义的函数,无论是成员函数还是非成员函数函数,始终是内联函数。
  4. 声明为constexpr的函数始终是内联的。
  5. source

    在标题中声明内联函数时,是否[{1}}是一个提示]的情况呢?

    是。 inline关键字总是提示编译器执行“内联”。

    但请注意,这只是一个提示。编译器可以自由地忽略它(很多人都这样做。)

    编译器能够对内联函数执行内联的真正原因是整个定义可用。您将注意到与inline函数和实例化函数模板相同的内联。

    编译器在哪个编译单元中放置代码?

    在链接之前,内联函数将在定义它的任何编译单元中完全定义。它将完整地编译到每个目标文件中。

    在链接期间,链接器将确定要使用的定义,并丢弃所有其他定义。

    另见this question及其答案。

答案 1 :(得分:1)

代码将出现在包含此标头的所有编译单元中。 inline的要点是向链接器说这个函数可以在多个目标文件中找到,并且链接器可以选择任何这些副本。

答案 2 :(得分:0)

Inline并非被迫。如果在类定义中定义方法,则会隐式内联。它类似于在类定义之外定义,除了内联隐含。这与定义所在的文件无关。

当您请求内联的函数实际上没有内联时,由编译器来决定放置它的位置。在早期,你可以在包含头文件的每个文件中获得一个非导出的副本。现在,应用一些策略,例如将它放在与第一个构造函数相同的位置,第一个方法或虚拟函数表的位置是。它取决于编译器。