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

`auto` making a new variable instance each time?

我想知道是否每次使用 auto 或任何其他声明 variable/iterator/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;

    }

}

是的。例如,使用 const auto&auto&& 声明引用,以防您希望避免创建对象的副本。

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

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

考虑这个特定的代码:

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 & 也不太可能在这种情况下提高效率。