Есть ли случай, когда передача по const & не является оптимальной для строк? - PullRequest
0 голосов
/ 19 октября 2019

Недавно я упомянул относительно новому пользователю, что он должен передавать строковые параметры как const std::string & вместо передачи их по значению и получил комментарий:

передача по const ref не обязательно лучшезатем проходя по постоянному значению. Особенно, если вы часто читаете из нее в функции.

При поиске я нашел только практическое правило, которое рекомендует использовать & или const & для любого типа X, где sizeof(X) > sizeof(void *).

Так что может быть в таком случае, когда передача строки по (const) значению лучше, чем передача ее по const &, если она есть?

1 Ответ

4 голосов
/ 19 октября 2019

Есть ли какой-либо случай, когда передача по const & не оптимальна для строк?

В тех случаях, когда у вызывающей стороны нет объекта std::string, во-первых, создаетсяодин для передачи ссылки не является оптимальным. Аргумент std::string_view охватывает эти случаи, а также большинство случаев, когда ссылка на строку является оптимальной.

, что может быть в таком случае, когда передача строки по значению (const) лучше, чем передача по const &, если она есть?

Текстто, что вы цитируете, описывает такой случай:

... Особенно, если вы часто читаете из него в функции.

Чтобы объяснить почему : копирование в аргумент происходит только один раз за вызов функции, в то время как косвенное обращение через ссылку (или представление строки) происходит при каждом доступе в функции. Учитывая, что ни одна из них не является бесплатной, должно быть некоторое количество косвенных указаний, которые стоят дороже, чем копия.

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

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

...