【发布时间】:2013-01-17 18:16:47
【问题描述】:
我听说它断言在 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++ 的某些实现中的一个错误,还是标准要求编译器以某种方式为此类函数创建条目?如果这种膨胀被认为是一个错误,是否有已知的编译器不存在这问题?
【问题讨论】:
-
您也可以只使用
f(x)和g(y)之类的名称来减小符号表的大小,但这也不是一个好主意。 -
你有没有证据支持未命名的命名空间膨胀符号表的断言?
-
公司其他开发者声称,本人没有亲身经历。我们还没有使用 C++11。
-
为什么投反对票?如果这是真的,最好知道静态方法是否可以防止问题。如果它是错误的,那么最好有一个可靠的答案我们可以用作参考......
标签: c++ language-lawyer symbol-table unnamed-namespace