古風なCおよびC ++では、コンパイラーに可能な最適化に関する提案(提案にすぎない)のinline
ようなものregister
です。
最新のC ++では、inline
複数の定義(宣言ではない)が異なる変換単位で見つかった場合、それらはすべて同じであり、リンカーは1つを自由に保持し、他のすべてを破棄できることをリンカーに伝えます。
inline
ヘッダーファイルで関数が定義されている場合(複雑または「線形」に関係なく)、リンカによって「複数の定義」エラーが発生することなく複数のソースにその関数を含めることができるようにする必要があります。
(グローバル関数とは対照的に)テンプレート関数と同様に、クラス内で定義されたメンバー関数はデフォルトで「インライン」です。
//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }
//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }
//main.cpp
#include "fileA.h"
void acall();
int main()
{
afunc();
acall();
}
//output
this is afunc
this is afunc
fileA.hが2つの.cppファイルに含まれているため、のインスタンスが2つあることに注意してくださいafunc()
。リンカはそれらの1つを破棄します。no inline
が指定されている場合、リンカは文句を言うでしょう。