命名空间包含是否会增加exe的大小

时间:2012-09-04 10:41:49

标签: c++ linux namespaces size

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

从我的实验中可以看出

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

编译时间存在差异

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

由于

4 个答案:

答案 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>;指令的唯一理由是程序员在保存打字的几个字符方面的纯粹懒惰。那几个保存的打字字符花费很大。