【发布时间】:2021-05-03 05:44:54
【问题描述】:
我正在一个代码审查会议中进行讨论。
争论是关于匿名命名空间中的函数是否应该声明为静态的。例如,有人告诉我使用“static”关键字声明的 square3 函数具有优势。
namespace {
int square2(int num) {
return num * num;
}
static int square3(int num) {
return num * num;
}
}
我的同事告诉我静态是有益的,因为:
静态函数不需要函数表中的条目,并且 因此链接时不需要时间或内存。
static 表示链接时不暴露。它改善了链接时间 并减少链接时的内存使用。匿名命名空间不 提供这个。
我认为我的同事所说的“功能表”是指“符号表”。除了另一个S.O question 最不赞成的答案外,我找不到任何关于此的文档
通常最好选择静态链接,因为那样不会 污染符号表
我正在尝试使用编译器资源管理器查看该信息是否正确。但我找不到进入符号表的方法。我看到的所有函数名称和所有内容都在same way 中被破坏。
所以我有两个问题:
1 - 在匿名命名空间中使用带有 static 关键字的函数是否有助于减少内存/链接时间?
2 - 有没有办法在编译器资源管理器中检查符号表?
【问题讨论】:
-
对于2.您可以添加
readelf工具并使用--symbols检查符号表。像这样godbolt.org/z/dsW1xd -
非常感谢。我可以在“符号表 '.symtab' 包含 65 个条目:”下看到一个额外的符号:但我不确定 .symtab 是什么。
-
Executable 和LinkableFormat 定义了可执行二进制文件的结构。它有部分,在这些部分中,有两个部分用于编译器资源管理器生成的可执行文件中的符号。.symtab是这两个部分之一的名称。 -
如果可以发布答案,这非常有帮助。它对其他一些读者也很有用。