2

外部リンケージ (グローバル名前空間の乱雑/衝突以外) を持つシンボルを持つことに欠点はありますか? たとえば、呼び出さない関数ウィッチがある場合、内部リンケージがある場合、コンパイラはそれを破棄できますが、外部リンケージがある場合、誰かが後でリンクする可能性があるため、コンパイラはそのコードを残す必要があると思います. これは正しいです?他に欠点はありますか?

static キーワードの代わりに名前のない名前空間が推奨されることを知っているので質問していますが、名前のない名前空間のシンボルにはまだ外部リンケージがあるため、上記の欠点に悩まされることになります (私が正しい場合)。標準が言うような静的関数よりも優れています。

4

1 に答える 1

2

名前のない名前空間の関数が外部リンケージを持つという事実は、ほぼ完全に技術的な問題です。それらは「秘密の」翻訳単位に依存する一意の識別子を持っているため、別の翻訳単位からそれらに名前を付けることは不可能です。これは、コンパイラが別の翻訳単位から名前で呼び出されることはないと想定できることを意味します。私が知っているほとんどの実装は、真の内部リンケージを持つ関数と同様に、名前のない名前空間の関数をグローバル シンボルではなくローカル シンボルに変換します。

名前のない名前空間の関数は、それが定義されている翻訳単位から呼び出されず、アドレスが取得されて翻訳単位から渡されない場合、プログラムに影響を与えずに破棄できます。直接の名前付き関数呼び出しになります。

于 2012-05-17T12:30:16.580 に答える