С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
3 / 3 / 0
Регистрация: 15.08.2014
Сообщений: 378
1

Как работает перемещение и rvalue в моем примере ?

06.07.2024, 22:17. Показов 1493. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Помогите, пожалуйста, понять rvalue и семантику перемещения на следующем примере:

насколько я понимаю такого рода пример должен приводить к перемещению значения строки s,
т.е. она должна остаться пустой, однако этого не происходит.
Почему ?
В этом примере это вообще невозможно, он некорректен ?
Или возможно, но я что-то не так сделал ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
 
void rv(std::string&& s_rv){
   ... делаем что-то со строкой s_rv
 
   std::string s2 = s_rv;
 
}
 
main() {
   std::string s = "123";
 
   rv(std::move(s));
 
   std::cout << s << std::endl;
 
   // здесь вывод = "123". Почему ? Это конструкция не переместит значение
   // значение строки из  s?
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2024, 22:17
Ответы с готовыми решениями:

Объясните как работает полиморфизм на моем примере
Здравствуйте уважаемые. Пожалуйста объясните на моем примере, как это работает. Выдержки из моего...

Объяснить как работает рекурсивная функция и стек вызовов на моем примере
Объясните пожалуйста как работает рекурсивная функция и стек вызовов на моем примере. Здесь...

Обращение к модулю по имени. В скачанном примере работает, в моём нет
Нашёл модуль глобального обработчика ошибок. Честно всё скопировал, но у меня стал ругаться. Сам...

Как использовать пример наследование моем примере?
Я сделал в windows forms Чтение и запись данных в файл Вот код: namespace test_3 { public...

Обьясните как дублировать...на моём примере пожалуйста!!!
Вводится длина одномерного массива, состоящего из целых чисел, и его элементы. продублировать...

22
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
08.07.2024, 22:04 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
Последняя barfoo, с двумя перегрузками, покрывает все случаи, конечно, если это необходимо. При этом ничего не копируется и не перемещается. При этом ничего не копируется и не перемещается.
Если функции barfoo нет необходимости модифицировать свой параметр, то тогда достаточно одного варианта - barfoo(const A &).

А вот если функции barfoo нужно модифицировать свой параметр, то вариант barfoo(const A &) будет скорее всего вынужден сделать копию своего параметра внутри функции. То есть копирование при этом все-таки будет, просто оно будет упрятано внутрь функции, а не привязано к параметру.

В такой ситуации может оказаться разумнее написать просто одну-единственную barfoo(A) вместо двух вариантов, т.е. с передачей по значению. Эффективность варианта barfoo(const A &) при этом не упадет, ибо копирование этот вариант и так делал. Оно теперь просто переместилось на параметр.

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

Поэтому общее правило таково: если вам нужно выжать последние такты производительности на основе move semantics, то пишите две функции: const A & и A &&. А если такого "выжимания" не требуется (что составляет 99%) - пишите одну с передачей по значению A. Вы получите практически всё от move semantics, но без необходимости писать две функции.
1
фрилансер
5846 / 5377 / 1103
Регистрация: 11.10.2019
Сообщений: 14,376
09.07.2024, 08:06 22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то пишите две функции: const A & и A &&.
как вариант - шаблон с форвардом
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
09.07.2024, 08:12 23
Цитата Сообщение от Алексей1153 Посмотреть сообщение
как вариант - шаблон с форвардом
Это если функция просто форвардит аргументы дальше. Я же вел речь о ситуации, когда рассматриваемая функция уже является конечным получателем аргументов, т.е. реализует оконечную функциональность, работает с аргументами сама.
0
09.07.2024, 08:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2024, 08:12
Помогаю со студенческими работами здесь

Как работать с двумерными массивами через указатель на моем примере?
Имеются одномерные массивы {x}_{k} и {x}_{i}, с которыми я работаю через указатель. Например: ...

Не работает javasript анимация на моем сайте. На отдельной html странице работает, на моем не хочет
&lt;html&gt; &lt;head&gt;&lt;title&gt;Линейное движение картинки&lt;/title&gt; &lt;script&gt; function init_move() { ...

Как сделать так, чтобы айдишники самостоятельно проставлялись? покажите пожалуйста на моем примере
здесь коды проставлены вручную --создание таблицы поставщик create table posta( Kod_posta...

C++ and dll -> нужна консультация на моём примере
Нужно загрузить несколько классов в dll, а потом, в другом проекте прочитать эти классы из dll и,...

Какой профит от ssd? На моем реальном примере
Надоело на графики смотреть в обзорах ssd и тесты CrystalDiskMark. Не понятно как скажется на...

Диапазон для Switch, именно в моем примере
Предварительно полистал другие темы, но похожую на мою не нашел. Так что, буду благодарен, коль...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru