【发布时间】:2019-04-10 12:09:39
【问题描述】:
假设我正在命名空间l 中创建自己的库。使尽可能多的命名空间成员模板化是否有益?这将鼓励编译器只为库用户实际调用的成员生成指令。为了说明我的观点,我将在这里进行演示:
1)
namespace l{
template <typename = void>
int f() { return 3; }
}
对比
2)
namespace l{
int f() { return 3; }
}
没有在 main 中调用它来显示差异。
int main() { return EXIT_SUCCESS; }
函数1)不需要l::f()的额外说明:
main:
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], 0
mov eax, 0
pop rbp
ret
函数 2) 确实需要针对 l::f() 的额外说明(如果再次调用 l::f()):
l::f()
push rbp
mov rbp, rsp
mov eax, 3
pop rbp
ret
main:
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], 0
mov eax, 0
pop rbp
ret
【问题讨论】:
-
如果目的是隐藏未“导出”的函数,请使用匿名命名空间。这将允许编译器在它们未被使用或到处内联时删除它们。
-
你真的担心优化编译时间吗?或者是其他东西?如果您正在尝试(过早地)优化编译时间,是时候构建您担心的库或客户端代码了吗?
标签: c++ templates compilation