Привязка rvalue ref к строковому литералу в конструкторе по сравнению с построением на месте

Я немного смущен временными параметрами С++ в отношении строковых литералов и семантики перемещения.

Какой из следующих вариантов лучше с точки зрения производительности и удобочитаемости.

Использование: Constructor("string_literal")

Вариант 1: s создается из строкового литерала, затем перемещается в переменную-член.

Constructor(
   string s
) : s_(std::move(s)) {}

Вариант 2: строковый литерал создается как временный, затем привязывается к s, а затем перемещается в член s_.

Constructor(
   string&& s
) : s_(std::move(s)) {}

Вариант 3: передать ссылку lvalue во временную, а затем скопировать-создать s_

Constructor(
   const string& s
) : s_(s)

В случае, когда вызывающая сторона передает конструктору строковый литерал, кажется, что вариант 1 немного более эффективен, поскольку мы пропускаем привязку rvalue ref и lvalue ref соответственно.

Если вызывающий объект передает строку конструктору, то вариант 1 будет выполнять копирование и перемещение, а вариант 2 заставляет пользователя создать копию, которая затем будет перемещена. Производительность идентична, но у пользователя чуть менее дружественный API для 2.

С каким вариантом лучше пойти? Спасибо.

Прочитайте Основные рекомендации C++ F.16: Для параметров "in"...

Richard Critten 16.05.2022 20:50

Вы можете просто добавить конструктор const char *, аналогичный тому, что делает std::basic_string. Тогда все те вопросы, о которых вы говорите, становятся спорными.

PaulMcKenzie 16.05.2022 20:55
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант 1 будет копироваться, когда у вас есть подвижная строка, строить и перемещать из литерала.

Вариант 2 будет перемещаться, когда у вас есть подвижная строка, и конструировать и перемещать, когда у вас есть литерал.

Вариант 3 самый худший, так как он всегда будет копироваться.

Как видите, Вариант 2 <= 1 <= 3.

Также рассмотрите

Constructor("string_literal"s)

Это буквальный std::string. Таким образом, вариант 2 просто переместит это право.

Примечание. Во многих случаях компилятор также может оптимизировать копии.

Другие вопросы по теме