`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 &
也不太可能在这种情况下提高效率。
我想知道是否每次使用 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 &
也不太可能在这种情况下提高效率。