我听说它断言在 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;
}
在函数之前使用静态声明而不是将其放置在未命名的命名空间中是否具有使函数在定义它的编译单元之外无法访问的相同效果?除了可能不会导致符号表增长之外,这两种方法之间是否有任何区别?
由于未命名的名称空间导致的符号表膨胀问题只是 C++ 的某些实现中的一个错误,还是标准要求编译器以某种方式为此类函数创建条目?如果这种膨胀被认为是一个错误,那么是否有已知的编译器不存在这问题?