-2

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;
}

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

4

2 回答 2

6

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

当然,当您确实有一个自定义点时,您希望使用非限定调用来进行参数相关查找。如果不需要自定义点的默认实现,则不需要声明甚usingusing指令。自定义点使用不当可能会对性能产生负面影响。例如,使用时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()可能导致值v1和副本更有效v2。对于启用移动的类型T,差异并没有那么严重,但仍然可能很大。当然,这里的问题不在于使用限定或不使用限定,而是两种调用函数的方式可能会导致根据是否swap()重载 for找到不同的函数T

顺便说一句,如果您对效率感兴趣,请不要使用 std::endl

于 2016-12-22T04:08:54.227 回答
1

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

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

于 2016-12-22T10:53:51.727 回答