Каков наилучший способ отправки QStrings при вызове функции? - PullRequest
20 голосов
/ 20 января 2010

Я хотел бы знать, каков наиболее эффективный и практичный способ отправки Qstring в качестве параметра функции, в частности, в QT. Я хочу использовать ссылку. Проблема в том, что я также хочу создать экземпляр этой строки в самой функции, например, так:

это прототип функции:

void myFunction(QString & theMsg);

это вызов функции:

myFunction(tr("Hello StringWorld"));

теперь function tr() возвращает QString, но он не работает со ссылкой (я понимаю почему).

Я должен сделать это:

QString theQstr("Hello StringWorld"); 
myFunction(theQstr);

Есть ли более простой способ сделать это, все еще используя ссылки, или я могу просто изменить параметр функции, чтобы использовать QString, и он все еще будет эффективен?

Ответы [ 3 ]

14 голосов
/ 20 января 2010

QString использует COW (Copy On Write) за кулисами, поэтому действительная строка не копируется, даже если вы используете такую ​​подпись:

void myFunction (QString theMsg)

(пока вы его не измените).

Если вам абсолютно нужна ссылка, я бы использовал const &, если вы не планируете изменять входной аргумент.

void myFunction (QString const & theMsg)

9 голосов
/ 21 января 2010

Наиболее эффективным и практичным способом является использование константной ссылки. QString COW будет медленнее, чем передача по ссылке, но быстрее, чем обычная копия.

1 голос
/ 08 мая 2018

Когда вы передаете QString, сайт вызова должен вызвать QString copy ctor, а затем dtor: оба подразумевают операцию атомарного подсчета ссылок (не пренебрежимо малую) и еще несколько сгенерированных ассемблерных кодов. Следовательно, более медленный и больший код (я не упоминаю здесь менее распространенный сценарий std :: move).

С другой стороны, когда вы передаете const QString &, на вызываемом сайте возникает двойное косвенное обращение к символам: указатель на указатель. Следовательно, это медленнее, чем передача QString, особенно если параметр QString широко используется.

Я бы рекомендовал всегда передавать const QString &, и если вам нужна максимальная скорость на вызываемой стороне, создайте там копию QString и получите доступ к этой локальной копии, чтобы избежать двойного косвенного обращения (более быстрый, менее сгенерированный код).

...