C++ C++;性能:使用声明Vs使用声明Vs直接从库中使用名称

C++ C++;性能:使用声明Vs使用声明Vs直接从库中使用名称,c++,performance,C++,Performance,在使用标准库对象时,我使用的声明比使用显式std::方法更多。我遇到了这样一个问题:使用声明s、使用声明性s以及直接使用标准库中的名称是否会提高性能 例如: 要打印“Hello world”,我们可以使用以下方式: 通过使用裸std::方式: std::cout这三种方法都将产生相同的运行时代码,从而提高性能。(通过切换到程序集输出,例如g++-O3-S test.cpp,可以轻松验证) 如果您谈论的是编译时,那么这不太可能产生任何可测量的影响。理论上完全限定名称(::std::cout)可以

在使用标准库对象时,我使用的声明比使用显式
std::
方法更多。我遇到了这样一个问题:使用声明s、使用声明性s以及直接使用标准库中的名称是否会提高性能

例如:

要打印“Hello world”,我们可以使用以下方式:

  • 通过使用裸
    std::
    方式:


    std::cout这三种方法都将产生相同的运行时代码,从而提高性能。(通过切换到程序集输出,例如
    g++-O3-S test.cpp
    ,可以轻松验证)


    如果您谈论的是编译时,那么这不太可能产生任何可测量的影响。理论上完全限定名称(
    ::std::cout
    )可以减少需要检查的潜在符号的数量。然而,磁盘I/O很可能要重要得多。事实上,我用三种变体对一个简单的程序进行了100次编译测试:
    ::std::cout
    std::cout
    使用名称空间std;cout
    。即使在没有优化的情况下编译(使符号查找尽可能重要)和在快速SSD上编译(使磁盘I/O时间最小化),任何差异都低于噪声级。

    这对运行时性能没有影响。using在编译时应用

    这些方法在运行时进行比较时完全相同,因为
    using
    以前是编译的

    但是,如果您想创建自己的名称空间,您应该小心

    #include <iostream>
    
    namespace test
    {
       int a = 1;
    }
    
    using namespace test;
    
    int main()
    {
       int a = 3;
       std::cout << test::a << std::endl; // prints 1
       std::cout << a << std::endl; // be careful, prints 3
       return 0;
    }
    
    #包括
    名称空间测试
    {
    INTA=1;
    }
    使用名称空间测试;
    int main()
    {
    INTA=3;
    
    std::难道我不相信它们在运行时有任何影响。它们主要是关于键入源代码所需的工作。为什么您怀疑性能会有差异?因为我觉得如果使用using声明添加所有不同的名称,那么编译时间会增加一点。此外,我还觉得直接从标准库中填充名称将提高性能。如果有疑问,请检查汇编语言列表和配置文件。如果您所在的系统中的
    std::cout
    ::std::cout
    -滚开!@BoPersson