C ++中基于范围的for的性能

Iul*_*iuc 1 c++ for-loop

假设x是a vector<vector<int>>,我想计算的每个元素的大小之和x。这是一个愚蠢的示例,但是我想问一下,当的元素的大小x足够大时,上述方法是否等效于性能。

// The first method:
int sum = 0;
for (vector<int> it : x)
    sum += it.size();

// The second method:
int sum = 0;
for (vector<int>& it : x)
    sum += it.size();
Run Code Online (Sandbox Code Playgroud)

我认为第二个for更快,因为它使用了&,因此x不会将的每个元素的值复制到it。我是对的还是两种方法执行的都一样?

Sne*_*tel 5

是的,没错。当使用auto以下代码时,意外地将其复制到有范围的for循环变量中是一个特别常见的问题:

for (auto it : x)
     sum += it.size();
Run Code Online (Sandbox Code Playgroud)

这是低效的,因为即使使用auto来自动设置类型,并且即使迭代是在vector&s 集合上,也it最终拥有type vector。(解决方案将会auto&,甚至更好auto const&。)

顺便说一句,这里的主要性能接收器不只是将元素从内部复制x到您的临时文件it,还包括分配和释放的使用的内存it


Nik*_* C. 5

是的,第二个for更快。大向量很多。进行测试非常容易:

http://quick-bench.com/hR5VI3JwybDC0eBra6u8Ytd3uZ8

基准结果