在c ++中定义名称空间的成本是多少?我所说的具体是指编译时/运行时增加和/或内存占用。假设我有一个带有头文件的普通程序,一个带有main的.cpp程序。如果我在标题中定义了namespace
,是否会注意到上述统计数据中的变化? 10、100或1,000个名称空间如何?如果已定义但从未使用过该怎么办:这会改变答案吗?我猜您可能会说我很好奇此构造如何与编译器进行交互。
类似地,我对struct
/ class
定义和using
的作用感到好奇,但我想不出一个涵盖这三个问题的好标题。
答案 0 :(得分:10)
在c ++中定义名称空间的成本是多少?
您必须写更长的名称†。通过避免在不同命名空间之间使用名称冲突这一事实,可以抵消这一成本。如果名称有冲突,则简称没有用。
†并非如此:名称空间使您无需花费太多时间即可编写代码,因为您不必总是将名称空间重新输入不合格的标识符。
我专门指编译时间
潜力很小。
运行时间增加
实践中没有。
如果我在标头中定义命名空间,我是否会注意到上述统计数据的变化?
您可以通过测量找出答案。
您可能不会注意到。
答案 1 :(得分:4)
我专门指编译时间
命名空间可以显着减少编译时间,因为使用函数时编译器可以减少进行检查的重载。
使用using namespace xyz;
通过使用友元函数而不是自由函数可以进一步提高编译时间,因为ADL的检查负担甚至更少(对于运算符或您已经在使用ADL)
答案 2 :(得分:1)
我无能为力,但这是一个真实的(尽管是传闻)命名空间实际成本的示例。
几年前,我在一家技术实力非常强的大公司工作(这里不再赘述)。他们的代码库的独特之处之一是它主要是服务器端的Unix二进制文件,以32位模式编译。公司使用的一种编码约定是每个名称应放在3个嵌套的命名空间中-相当长的公司名称命名空间,后跟3个字符名称命名空间,而不是5个字符中的另一个。 (旧版代码有例外)。
代码库很大(在强大的计算机上,可执行文件的链接最多可能需要15分钟的时间),并且它们已达到32位的可执行文件大小的自然极限。即将推出-添加了新代码,并且接近了厄运极限。在紧急销售模式下讨论了许多解决方案,其中一个解决方案是,如果我们仅在名称空间中使用公司名称的简写,而在嵌套名称空间中使用较少的字符,则可以推迟32位的厄运限制几个月!
全面披露-我不知道如何解决这个问题,我在世界末日之前离开了公司。