【问题标题】:C++- "using" keyword or using namespace name with scope resolution operatorC++-“使用”关键字或使用具有范围解析运算符的命名空间名称
【发布时间】:2017-05-07 15:10:35
【问题描述】:

C++ 中的各种程序都是这样编写的,不使用范围解析运算符:

#include <iostream>
#include <string>

int main()
{
std::string name = "My Name";
std::cout << name << std::endl;

return 0;
}

我也见过使用“使用”关键字:

#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "My Name";
cout << name << endl;

return 0;
}

出于效率原因,哪一个更好?

【问题讨论】:

  • 效率没有差别。
  • 什么意思“不使用范围解析操作符”?您的示例两次使用它。你的意思是

标签: c++ namespaces using scope-resolution


【解决方案1】:

假设最终找到相同的名称,效率是相同的:与函数名称的拼写方式无关,调用的是相同的函数。主要区别在于名称的定位方式。使用完全限定可以防止例如依赖于参数的查找,因此更容易理解。

当然,当您确实有一个自定义点时,您会希望使用非限定调用来进行参数相关查找。如果不需要自定义点的默认实现,则没有需要有一个using 声明,甚至是一个using 指令。自定义点使用不当可能会对性能产生负面影响。例如,当使用swap() 时,您确实想要使用限定名称:

template <typename T>
void some_function(T& v1, T& v2) {
    std::swap(v1, v2); // <--- this is bad! It uses the default implementation

    using std::swap;   // make a default implementation visible
    swap(v1, v2);      // <--- this is better: if it exists uses T's swap()
}

如果T 具有自定义的swap(),它可能比std::swap() 更有效,这可能会导致值v1v2 的复制。对于启用移动的类型T,差异并没有那么严重,但仍然可能很大。当然,这里的问题不是使用限定或不限定,而是这两种调用函数的方法可能会导致找到不同的函数,具体取决于 swap() 是否为 T 重载。

顺便说一句,如果你对效率感兴趣,do not use std::endl

【讨论】:

  • 那么,我应该使用'\n'而不是endl吗?
  • @ProthomOntim:是的 - 这不会一直刷新流。
  • @T.C.:好点。我已将代码 sn-p 更改为不使用 std::vector
【解决方案2】:

这两个程序应该产生相同的可执行代码。在 C++ 中,名称查找发生在编译时,而不是运行时,因此编译器在编译期间找到名称,然后没有任何变化。没有运行时评估,因此用于查找给定名称的语法不会影响程序的效率。

正如 Dietmar 所说,语法的选择可能会导致找到一个不同的名称,这可能会改变行为,但假设找到相同的名称,效率不会有任何差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多