Есть ли эффективный способ возврата по значению для самостоятельного назначения? - PullRequest
0 голосов
/ 24 апреля 2020

Обычный cpp совет для выходных параметров: «избегайте передачи выходных параметров по изменяемой ссылке, вместо этого возвращайте по значению». Теперь, если у нас есть случай, когда мы хотим изменить сам объект, например,

string s = "whatever";
//maybe in a loop
s = modify(s);

, то выглядит так, что функция string modify (string) всегда превосходит такую ​​функцию, как modifyInPlace(string &). Есть ли способ обойти эту проблему? Есть ли фундаментальная причина, почему это никогда не может быть решено? Я думаю, что семантика принятия по значению, возврата по значению безопаснее и понятнее.

Пример сравнительного измерения: http://quick-bench.com/-XZqOZw-X739tlcOI8vau8DU24w

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Есть ли способ обойти эту проблему?

Вы должны сделать выбор. Либо

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

Необходимо учитывать, что является более важным для вашей программы.

Тем не менее, издержки на изменение копии обычно не значительны, если вы создаете ее с помощью перемещения:

s = modify(std::move(s));

Вот модифицированная версия вашего теста: http://quick-bench.com/X_ONMO_yiAqbkkcbvsiC_Xpk5Sw


Правило «без эталонных параметров вывода» работает хорошо, когда вы создать новое значение, которое не основано на существующем значении того же типа. В таком случае, как правило, нет альтернативы на месте.

0 голосов
/ 24 апреля 2020

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

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