QStringView
обычно используется в высокопроизводительном коде, где создание реальных QString
объектов будет медленным из-за задействованного выделения памяти.Я оптимизировал QStringView
так, чтобы он работал так же быстро, как обрабатывал (const QChar*, size_t)
вручную.Я даже дошел до того, что вызовы функций-членов передавались в линию свободным функциям, передавая значение *this
.Все это состоит в том, чтобы избежать форсирования QStringView
объектов в стек или, в более общем смысле, в память.
Практически во всех компиляторах C ++ объект QStringView
представлен в виде пары регистров ЦП, и многиеABI C ++ (к сожалению, за исключением Windows) поддерживают передачу таких типов в регистрах ЦП в функции.Если вы написали функцию-член наивно, с неявным параметром this
в качестве адреса объекта, то вызов такой функции вне строки вынудил бы компилятор выделить объект QStringView
настек, чтобы иметь возможность передавать свой адрес в качестве первого аргумента функции-члена.
Есть второй аргумент для передачи по значению: меньше проблем с наложением.В качестве ссылочного типа, в любом случае, QStringView
демонстрирует эту проблему, но рассмотрим std::complex
: возьмите
std::complex &operator*=(std::complex &lhs, const std::complex &rhs);
(для краткости аргументы шаблона опущены).Это можно назвать так:
std::complex c = 3 + 4i;
c *= c;
Если вы наивно реализуете operator*=
, как если бы это была математическая функция:
auto r = real(), i = imag();
m_real = r * other.real() - i * other.imag();
m_imag = r * other.imag() + i * other.real();
вы бы забили other.real()
после первоголиния, таким образом вычисляя неправильный результат (да, люди делают пишут этот код в производстве).Передача rhs
по значению устраняет проблему.