6

我参加了一个会议,其中被教导我们不应该使用“使用命名空间 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]$

正如我从我的实验中看到的那样

对二进制文件的大小没有影响

只要

编译时间有差异

如果我的结论有缺陷,请纠正我

谢谢

4

4 回答 4

3

using namespace std 不应该影响大多数编译器的二进制大小。由于另一个原因,仍然应该避免它:

命名空间 std 真的很大。从字面上看,那里有数千个标识符,它们都在您的程序范围内。这增加了与您自己的标识符或来自其他库的标识符发生冲突的可能性,这可能会导致一些令人讨厌的意外。

另请参阅此相关问题:为什么“使用命名空间标准”被认为是不好的做法?

于 2012-09-04T10:45:54.013 回答
2

我参加了一个会议,其中教导我们不应该使用“使用命名空间 std”,而是使用“std::cout”来使用 std 命名空间的一些调用,因为这会增加二进制文件的大小。

非常好的建议,废话的理由。这个理由是过早的优化,启动是错误的。

永远不要using namespace std;在头文件中使用。std头文件中的该指令会使用#includes 头文件的每个文件中的名称空间中的项目污染全局名称空间。

即使在源文件中,许多人也更喜欢它,std::whatever因为它使代码更易读、更易理解且不易出错。以一次性输入几个字符为代价,该std::前缀永远将意图传达给编译器,更重要的是,传达给代码的人类读者/人类维护者。毫无疑问,代码正在调用标准库中的某些内容。

使用using namespace <namespace_name>;指令的唯一理由是程序员非常懒惰以节省输入的几个字符。那些为数不多的节省的打字字符需要付出巨大的代价。

于 2012-09-04T12:23:12.350 回答
2

对二进制文件的大小没有影响

可执行代码和数据应该没有任何区别,因为在这两种情况下,您对同一个对象执行相同的操作,并且从对象名称中查找该对象的查找过程发生在编译期间。但是,在某些情况下,它们可能会生成不同数量的元数据,例如调试信息。

编译时间有差异

对源的任何更改都可能会更改编译时间,但您没有提供足够的数据来确定差异是否具有统计意义。您需要为每种配置重复实验几次,计算两个样本的均值和方差,并对均值差异应用显着性检验。

无论如何,即使您确实确定污染全局命名空间会使编译速度略微加快,但与可能浪费在跟踪名称冲突的时间相比,所节省的任何时间都将是微不足道的。命名空间中有很多名称std,您可能希望在自己的代码中使用其中的许多名称。这就是避免命名空间污染的原因;任何声称它会影响二进制文件大小的人并不完全理解他们在说什么。

于 2012-09-04T10:54:51.887 回答
2

二进制文件不一样,因为在一个中定义了 STD,而在另一个中则没有。我也有不同的尺寸。

但是,如果您剥离符号,您将获得几乎相同的二进制文件(不同的是一些 ELF 标头参数,例如编译时间)。

如果您将示例更改为此:

#include<iostream>

    using namespace std;


    int main()
    {
    #if 0
            std::cout<<"\n ==> Workign \n";
    #else
            cout<<"\n ==> Workign \n";
    #endif

    return 0;

    }

然后用#if 1and编译#if 0,你将得到相同大小的二进制文件,即使没有条带符号。

编译时间的差异是正常的。定义了宏后,文件变大了,预处理器必须做的更多。然而,新的 PC 是如此强大,以至于我会简单地忽略这个时间增加。

于 2012-09-04T10:59:11.950 回答