显式使用inline
关键字标记函数也是向编译器发出实际内联函数的非约束性提示,但我怀疑现代编译器和优化器是否会注意这个提示。然而,请注意,这个(内联提示)仅适用于使用关键字inline
的情况,而不适用于隐式内联的函数(例如问题中提到的默认构造函数和析构函数)。
inline
是一个链接器关键字。 - v.oddouinline
在 C++ 标准中有两个含义。
第一个含义是当你听到 inline
时想到的那种;将函数中的代码注入到调用它的地方。
C++ 标准建议实现在看到 inline
方法或函数时这样做,但不要求这样做。由于这种行为对 C++ 标准描述的抽象机器没有任何可观察到的行为变化,我认为这是非规范性建议。
第二个含义与链接有关。一个 inline
函数(或在 C++17 中的变量)可以存在于多个翻译单元中。通常情况下,在链接时间会出现错误;但是当变量或函数是 inline
时,除了其中一个实例外,所有其他实例都会被静默丢弃。如果它们在任何重要方面不同,这将导致程序 ill-formed,但不需要诊断。
这第二个意义是隐式构造函数和析构函数被隐式定义为内联的原因;这意味着不需要选择一个单一的翻译单元来存放它们。相反,它们会在需要时随处生成。它们可能会被优先实际内联到调用代码中,但最重要的是,如果它仍然存在一些残留副本(例如没有内联),则在链接时间不会出现错误,而是丢弃所有除一个之外的副本。
请参见 C++ 标准中的 inline。标准中的措辞比我上面使用的措辞更加难以理解,但更为精确不同。
inline
声明与编译器的内联几乎没有任何关系。这主要是一种奇怪的拼写方式,表示“允许有多个定义”。 - molbdnilo