【发布时间】:2019-10-17 10:54:21
【问题描述】:
我正在学习 std::vector 的 emplace() 并偶然发现了这段代码:
// vector::emplace
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector = {10,20,30};
auto it = myvector.emplace ( myvector.begin()+1, 100 );
myvector.emplace ( it, 200 );
myvector.emplace ( myvector.end(), 300 );
std::cout << "myvector contains:";
for (auto& x: myvector)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
我想知道为什么在 for 循环中他们使用引用 auto& x 而不是简单的副本,我尝试不使用 & 并且它的工作方式相同,这是避免复制的安全措施还是性能技巧?
【问题讨论】:
-
"避免复制或表演技巧?"两者,因为不复制(通常)可以提高性能
-
@FatihBAKIR 取消引用也不是免费的。有时复制更快,寄存器也很快。你必须测量。
-
@xaxxon 我不知道,因为我没有测量它。我唯一知道的是,在猜测性能方面,直觉几乎不比抛硬币(如果那样的话)好。
-
@FrançoisAndrieux 您说“有时复制速度更快” - 这是事实陈述。我问你怎么知道在某些情况下会发生这样的循环。
-
@FrançoisAndrieux,是的,但是这些与向函数传递 的东西有关,并且ABI 通常需要传递一个指针,这会产生间接开销。但是,这里的循环对编译器是可见的,它不必执行。
标签: c++ loops for-loop reference c++14