Есть ли относительная разница в копировании между char и char &? - PullRequest
0 голосов
/ 12 июня 2018

Например,

string str = "hello";
for (char  c : str) { } // 1 copy
for (char& c : str) { } // 2 reference

Существует ли относительная разница в издержках копирования между 1 и 2?символ 1 байта.Таким образом, в первом цикле for 1 байт копируется из str в c.Во втором цикле он передается по ссылке.Здесь для передачи по ссылке стоит скопировать указатель адреса (4 байта)?Интересно, как это работает внутри.

1 Ответ

0 голосов
/ 12 июня 2018

Стандарт C ++ ничего не гарантирует по этому поводу.Однако почти любой современный компилятор на обычном оборудовании должен преобразовывать оба цикла в один и тот же код (при условии, что оптимизация включена), потому что семантика копирования символа или обращения к ссылке на него не имеет значения на уровне машинного кода.

Вот три основных компилятора, которые делают именно это: https://godbolt.org/g/XfRX38

volatile char x;

void fooCopy(std::string str)
{
    for (char  c : str) {
        x = c;
     }
}

void fooReference(std::string str)
{
    for (char& c : str) {
        x = c;
    }
}

clang разворачивает цикл с коэффициентом 8, gcc делает его простым, а MSVC имеет точно такой жетело цикла в виде gcc, но с гораздо большим количеством границ / проверок стека вокруг него.

Но если вы сосредоточитесь на теле цикла, машинный код будет абсолютно идентичен для двух функций (без учета метки и имен регистров)) для каждого компилятора.


Лично я не использую ссылки на const для встроенных числовых типов, потому что я знаю (в моем случае для работы на x86), что CPU все равно будет хранить их в регистре и чтоих копирование не имеет накладных расходов.Это не должно быть правдой на каждом оборудовании, но в этом случае вам нужно исследовать себя - скорее всего, ваш компилятор знает это лучше, чем вы.

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