我知道inline
关键字只是编译器的提示,而不是强制(除非在MSVC中使用__forceinline)。
在标题中声明内联函数时是否也是这种情况?编译器在哪个编译单元中放置代码?
答案 0 :(得分:2)
inline
不仅仅是对编译器的暗示。
内联函数可以在多个翻译单元中定义,所有这些定义都具有相同的类型,地址和定义。
如果在标题中定义了一个函数,则必须将其声明为inline
,否则当它包含在多个翻译单元中时,它将违反一个定义规则。
内联函数是:
inline
。class
/ struct
/ union
定义中定义的函数,无论是成员函数还是非成员函数函数,始终是内联函数。constexpr
的函数始终是内联的。(source)
是。 inline
关键字总是提示编译器执行“内联”。
但请注意,这只是一个提示。编译器可以自由地忽略它(很多人都这样做。)
编译器能够对内联函数执行内联的真正原因是整个定义可用。您将注意到与inline
函数和实例化函数模板相同的内联。
在链接之前,内联函数将在定义它的任何编译单元中完全定义。它将完整地编译到每个目标文件中。
在链接期间,链接器将确定要使用的定义,并丢弃所有其他定义。
另见this question及其答案。
答案 1 :(得分:1)
代码将出现在包含此标头的所有编译单元中。 inline
的要点是向链接器说这个函数可以在多个目标文件中找到,并且链接器可以选择任何这些副本。
答案 2 :(得分:0)
Inline并非被迫。如果在类定义中定义方法,则会隐式内联。它类似于在类定义之外定义,除了内联隐含。这与定义所在的文件无关。
当您请求内联的函数实际上没有内联时,由编译器来决定放置它的位置。在早期,你可以在包含头文件的每个文件中获得一个非导出的副本。现在,应用一些策略,例如将它放在与第一个构造函数相同的位置,第一个方法或虚拟函数表的位置是。它取决于编译器。