我参加了一个会话,其中教导我们不应该使用“using namespace std”,而是使用“std :: cout”来使用std命名空间的一些调用 这将增加大小二进制文件
我尝试通过以下实验进行验证。代码&其输出如下: -
[Fooo@EXP]$ cat namespacestd.cpp
#include<iostream>
#ifdef STD
using namespace std;
#endif
int main()
{
#ifndef STD
std::cout<<"\n ==> Workign \n";
#else
cout<<"\n ==> Workign \n";
#endif
return 0;
}
[Fooo@EXP]$ time g++ -c namespacestd.cpp -DSTD
real 0m0.246s
user 0m0.215s
sys 0m0.030s
[Fooo@EXP]$ size namespacestd.o
text data bss dec hex filename
310 8 1 319 13f namespacestd.o
[Fooo@EXP]$ time g++ -c namespacestd.cpp
real 0m0.258s
user 0m0.224s
sys 0m0.034s
[Fooo@EXP]$ size namespacestd.o
text data bss dec hex filename
310 8 1 319 13f namespacestd.o
[Fooo@EXP]$ time g++ -o namespacestd namespacestd.cpp -DSTD
real 0m0.293s
user 0m0.251s
sys 0m0.042s
[Fooo@EXP]$ size namespacestd
text data bss dec hex filename
1980 580 288 2848 b20 namespacestd
[Fooo@EXP]$ time g++ -o namespacestd namespacestd.cpp
real 0m0.274s
user 0m0.239s
sys 0m0.035s
[Fooo@EXP]$ size namespacestd
text data bss dec hex filename
1980 580 288 2848 b20 namespacestd
[Fooo@EXP]$
从我的实验中可以看出
对二进制文件的大小没有影响
仅
编译时间存在差异。
如果我的结论存在缺陷,请纠正我
由于
答案 0 :(得分:3)
使用命名空间std不应该影响大多数编译器的二进制大小。其他原因仍应避免:
命名空间std真的很大。其中有数千个标识符,这些标识符都在您的程序范围内。这增加了与您自己的标识符或其他库中的标识符冲突的可能性,这可能会导致一些令人讨厌的意外。
另请参阅此相关问题:Why is "using namespace std" considered bad practice?
答案 1 :(得分:2)
对二进制文件的大小没有影响
可执行代码和数据应该没有任何区别,因为在这两种情况下,您对同一个对象执行相同的操作,并且在编译期间会从名称中查找该对象的查找过程。但是,在某些情况下,它们可能会生成不同数量的元数据,例如调试信息。
编译时间存在差异
对源的任何更改都可能会改变编译时间,但是您没有提供足够的数据来确定差异是否具有统计意义。您需要为每个配置重复几次实验,计算两个样本的均值和方差,并对均值的差异应用显着性检验。
无论如何,即使您确定污染全局命名空间使得编译速度稍快,但与可能浪费的追踪名称冲突的时间相比,任何节省的时间都会很小。 std
命名空间中有很多名称,您可能希望在自己的代码中使用其中的许多名称。这就是避免命名空间污染的原因;任何声称它会影响二进制文件大小的人都不能完全理解他们在说什么。
答案 2 :(得分:2)
二进制文件不一样,因为在一个中你定义了STD,在另一个中你没有定义。我也有不同的尺寸。
但是,如果你有strip个符号,你将得到几乎相同的二进制文件(不同的是一些ELF头参数,比如编译时间)。
如果您将示例更改为:
#include<iostream>
using namespace std;
int main()
{
#if 0
std::cout<<"\n ==> Workign \n";
#else
cout<<"\n ==> Workign \n";
#endif
return 0;
}
然后使用#if 1
和#if 0
进行编译,即使没有条带化符号,也会获得相同大小的二进制文件。
编译时间的差异是正常的。定义宏后,文件会更大,预处理器必须执行更多操作。然而,新的PC非常强大,我只是忽略了这个时间的增加。
答案 3 :(得分:2)
我参加了一个会话,其中教导我们不应该使用“using namespace std”,而是使用“std :: cout”来使用std命名空间的一些调用,因为这会增加二进制文件的大小。
非常好的建议,无意义的理由。这个理由是过早的优化,而且启动是错误的。
切勿在头文件中使用using namespace std;
。头文件中的该指令会在#include头文件的每个文件中使用std
命名空间中的项来污染全局命名空间。
即使在源文件中,许多人更喜欢std::whatever
,因为它使代码更易读,更容易理解,并且更不容易出错。在输入几个字符的一次性成本中,std::
前缀永远地将意图传达给编译器,更重要的是,传递给代码的人类读者/人类维护者。毫无疑问,代码正在从标准库中调用一些东西。
使用using namespace <namespace_name>;
指令的唯一理由是程序员在保存打字的几个字符方面的纯粹懒惰。那几个保存的打字字符花费很大。