Есть ли относительная разница в копировании между char и char & amp;?

Например,

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

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

1

Решение

Стандарт 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), что ЦП в любом случае сохранит их в регистре, и что их копирование не потребует дополнительных затрат. Это не должно быть правдой на каждом оборудовании, но в этом случае вам нужно исследовать себя — скорее всего, ваш компилятор знает это лучше, чем вы.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector