読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

ここからの立ち回り方は重要なり

staticとかinlineとかnamespaceで気になったので。

// 何らかのヘッダファイルに書いといて、これをいくつかのソースファイルからインクルードするとする
class a {
  static int b() {return 0;}
};

で、a::b()の実体は一つしか作られないことは保証されているらしいのですが同じ様なことを、

static int a() {return 0;}

inline
int b() {return 0;}

namespace {
int c() {return 0;}
}

でやった場合はどうなるのでしょうか。最適化で定数埋め込みにされるんじゃねというツッコミはナシの方向で。inlineは実際にインライン化された場合はそこに展開されて埋め込まれるのでしょうが、長い関数とかだった場合やアドレスが求められた場合はインライン展開されないので気になるところです。無名空間とか多分コンパイラ先生が意味不明な長ったらしい名前を頭かどっかに付けそうなのでソース毎に違う名前で実体化されそうな予感がしないこともないです。
テンプレートの場合は同じ型でインスタンス化された場合はリンク時に統合されると聞いたことがあるのですが・・・。個人的には上の例でも実体は一つだけになってほしいですが、そもそもヘッダにこの手の関数を書くなということなのでしょうかねぇ(多分inlineを除く?)。