`auto`每次都会创建一个新的变量实例?

时间:2017-06-14 17:25:49

标签: c++ auto

我想知道是否使用auto或其他任何声明变量/迭代器/ CallItWhatIsMoreAppropriate的内容,每次都会创建该项目的实例?一个例子可以说清楚:

void my_fun (std::unordered_map<std::string, std::string> & my_map) {

    std::string search_str;

    cin >> search_str;

    while (search_str != "something") {

        //Does the next line create an extra overhead each time?
        auto search = my_map.find(search_str);

        if (search != my_map.end())
        {
            std::cout << "found \n";

            //I should be able to modify the element inside the map here.

        } else {
            my_map.insert( {search_str, search_str});
        }

        cin >> search_str;

    }

}

2 个答案:

答案 0 :(得分:3)

考虑这个特殊代码:

while (search_str != "something") {

     //Does the next line create an extra overhead each time?
     auto search = my_map.find(search_str);

如果你的意思是有额外的开销vs:

  while (search_str != "something") {
        //Does the next line create an extra overhead each time?
        std::unordered_map<std::string, std::string>::iterator search = my_map.find(search_str);

没有任何区别,编译器只是为你推断出类型。如果你询问是否在循环之外声明迭代器:

  std::unordered_map<std::string, std::string>::iterator search;
  while (search_str != "something") {
        search = my_map.find(search_str);
        ...

会使它更有效率,理论上可行(在一些破碎的编译器上),但我几乎不怀疑会有任何。而且代码可读性在这里更为重要,因为变量内部循环声明变量会使其更清晰,更易读。

注意将search更改为const auto &或更明确的const std::unordered_map<std::string, std::string>::iterator &,在这种情况下也不太可能提高效率。

答案 1 :(得分:2)

是。例如,如果您想避免创建对象的副本,请使用const auto&auto&&来声明引用。

但是,迭代器的开销很小,通常按值传递。

更重要的是,您按值传递参数my_map。按值传递将阻止从函数外部看到对容器的任何更改(您正在编辑副本)。通过引用传递,以避免不必要的复制。