C ++で名前空間を使用して関数を定義し、それらが定義されているコンパイルユニットの外部から呼び出せないようにすることは、シンボルテーブルが大きくなるため、非常に大規模なコード環境では適切ではないと主張していると聞きました。名前のない場合にC++コンパイラが提供する自動生成された名前空間にこれらのシンボルへのエントリを含めることにより、不必要に大きくなります。
namespace {
// This function can only be accessed from hear to the end of
// any compilation unit that includes it.
void functionPerhapsInsertedIntoSymbolTable() {
return;
}
}
これはおそらく、上記が次のことを行うのと同じであると想定されていることを前提としています。
namespace randomlyGenerateNameHereNotCollidingWithAnyExistingNames {
// This function can only be accessed from hear to the end of
// any compilation unit that includes it.
void functionPerhapsInsertedIntoSymbolTable() {
return;
}
}
using randomlyGenerateNameHereNotCollidingWithAnyExistingNames;
しかし、それは本当に簡単ですか?コンパイラは、生成された名前空間名のシンボルのシンボルテーブルエントリを作成する必要がありますか?
代わりに、そのような状況では、静的宣言を使用することが提案されていると聞きました。
// This function can only be accessed from hear to the end of
// any compilation unit that includes it.
static void functionNotInsertedIntoSymbolTable() {
return;
}
名前のない名前空間に配置する代わりに関数の前に静的宣言を使用すると、関数が定義されているコンパイル単位の外部で関数にアクセスできなくなるのと同じ効果がありますか?シンボルテーブルを大きくしない可能性があることを除いて、これら2つのアプローチの間に違いはありますか?
名前のない名前空間によるシンボルテーブルの肥大化の問題は、C ++の一部の実装のバグにすぎないのでしょうか、それとも、コンパイラがそのような関数のエントリを作成するために標準で何らかの形で必要とされているのでしょうか。この膨張がバグと見なされる場合、これが問題にならない既知のコンパイラはありますか?