Производительность на основе диапазона для в C ++ - PullRequest
1 голос
/ 11 апреля 2019

Скажем, x - это 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();

Я думаю, что вторая for быстреепотому что он использует &, поэтому значения каждого элемента x не копируются в it.Я прав или оба метода выполняют одно и то же?

Ответы [ 2 ]

5 голосов
/ 11 апреля 2019

Да, второй for быстрее.Довольно много для больших векторов.И это очень просто:

5 голосов
/ 11 апреля 2019

Да, это правильно.Случайное копирование в ранжированную переменную цикла является особенно распространенной проблемой, когда используется auto:

for (auto it : x)
     sum += it.size();

Это неэффективно, поскольку даже при использовании auto для автоматической установки типа и даже при итерациипревышает набор vector& с, it заканчивается типом vector.(Решением было бы auto& или, что еще лучше, auto const&.)

Кстати, основным приемником производительности здесь было бы не просто копирование элементов изнутри x во временную it, но для выделения и освобождения памяти используется it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...