命名空间的成本

问题描述 投票:4回答:3

在c ++中定义命名空间的成本是多少?我特别指的是编译时/运行时增加和/或内存占用。假设我有一个带头文件的简单程序和一个带有main的.cpp。如果我在我的标题中定义一个namespace,我会注意到上述统计数据的变化吗? 10,100或1,000个命名空间怎么样?如果他们被定义但从未使用过怎么办:这会改变答案吗?我想你可以说我很好奇这个结构如何与编译器交互。

同样,我很好奇struct / class定义和using的影响,但我想不出一个包含所有三个问题的好标题。

c++ compiler-optimization
3个回答
10
投票

在c ++中定义命名空间的成本是多少?

你必须写更长的名字†。这一成本被不同名称空间中避免名称冲突的事实所抵消。如果名称存在冲突,则短名称无用。

†并非如此:命名空间允许您以较少的写入方式下车,因为您并不总是需要将命名空间重新键入不合格的标识符。

我特别指的是编译时

潜在的边缘。

运行时间增加

在实践中没有。

如果我在标题中定义命名空间,我会注意到上述统计数据的变化吗?

你可以通过测量找出答案。

你可能不会注意到。


4
投票

我特别指的是编译时

命名空间可以显着减少编译时间,因为编译器在使用函数时可能检查的重载较少。

使用using namespace xyz;时,这种优势会丢失

通过使用友元函数而不是自由函数可以进一步改进编译时间,因为ADL将具有更少的过载来检查(在运算符的情况下或者如果您已经在使用ADL)


1
投票

我无法帮助它,但这是一个真实的(虽然轶事)命名空间的实际成本的例子。

几年前,我在一家拥有非常强大技术存在的大公司工作(这里不再对他们说了什么)。他们的代码库的一个独特方面是它主要是服务器端,以32位模式编译的Unix二进制文件。该公司使用的编码约定之一是每个名称都应该放在3个嵌套的命名空间中 - 相当长的公司名称命名空间,后跟3个字符名称命名空间,而不是5个字符中的另一个。 (遗留代码有例外)。

代码库是巨大的(因为在一台非常强大的机器上连接可执行文件需要长达15分钟),并且它们达到32位可执行文件大小的自然限制。快速到来 - 添加了新代码,并且达到了厄运限制。在销售紧急模式中讨论了很多解决方案,其中一个是如果我们只是在命名空间中使用公司名称的简写,并且可能在嵌套命名空间中使用较少的字符,我们会推迟32位的厄运限制几个月!

完全披露 - 我不知道这种情况是如何解决的,我在世界末日前离开了公司。

© www.soinside.com 2019 - 2024. All rights reserved.