Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 11:13
Оценка: 6 (1) :)
Изучаю тут С++ для преподавания студентам.
И столкнулся с одной проблемой: не могу найти простого вменяемого примера для объяснения семантики переноса.
Теоретически все понятно: кода мы переносим файл, то сам файл с места не сдвигается, а меняется только управляющая информация.
Но в книгах:
Джоссатис. Стандартная библиотека С++11
Стенли Липпман (Лажойе, Му). Язык программирования С++.
Стивен Прата. Язык программирования С++. Лекции и упражнения.
Примеры несколько расплывчаты, как-то мутноваты.

Не могли бы наши гуру предложить простой (дубовый, кондовый... ), но в то же время точно отражающий семантику переноса пример?
Особенно обращаюсь к Кодту и Павлу Кузнецову — может быть вам уже приходилось это использовать и/или объяснять?
Буду весьма признателен.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Пример по семантике переноса
От: jazzer Россия Skype: enerjazzer
Дата: 26.08.14 11:26
Оценка: +3
Здравствуйте, LaptevVV, Вы писали:

LVV>Не могли бы наши гуру предложить простой (дубовый, кондовый... ), но в то же время точно отражающий семантику переноса пример?


std::vector. Все понимали с первого слова.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Пример по семантике переноса
От: anatoly1  
Дата: 26.08.14 11:37
Оценка: 1 (1)
Скорее всего там не пример нужен.
Полагаю, сначала нужно разобраться с rvalue-ссылками, а затем понять как работает функция swap на их основе.
И вполне возможно, что студентам эту тему можно не рассказывать. И без этих знаний можно писать программы на С++.
Re[2]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 11:45
Оценка:
Здравствуйте, anatoly1, Вы писали:

A>Скорее всего там не пример нужен.

A>Полагаю, сначала нужно разобраться с rvalue-ссылками, а затем понять как работает функция swap на их основе.
A>И вполне возможно, что студентам эту тему можно не рассказывать. И без этих знаний можно писать программы на С++.
Ну, можно и без виртуальности писать... Но ведь рассказываем жеж...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 11:48
Оценка:
Здравствуйте, jazzer, Вы писали:

LVV>>Не могли бы наши гуру предложить простой (дубовый, кондовый... ), но в то же время точно отражающий семантику переноса пример?


J>std::vector. Все понимали с первого слова.

Что вектор?
Правильно ли я тебя понимаю,
что можно рассматривать использование динамической памяти вектором с использованием unique_ptr — как некий аналог семантики переноса?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Пример по семантике переноса
От: uzhas Ниоткуда  
Дата: 26.08.14 11:55
Оценка: 1 (1) +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Теоретически все понятно: кода мы переносим файл, то сам файл с места не сдвигается, а меняется только управляющая информация.


так как я изначально вопрос не понял, то сразу рождается совет: ни в коем случае не рассматривай move semantic на примере с файлами
возьми что-нибудь из мира C++, пусть будет std::vector. не усложняй и без того сложную тему
Re[2]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 12:02
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, LaptevVV, Вы писали:


LVV>>Теоретически все понятно: кода мы переносим файл, то сам файл с места не сдвигается, а меняется только управляющая информация.


U>так как я изначально вопрос не понял, то сразу рождается совет: ни в коем случае не рассматривай move semantic на примере с файлами

U>возьми что-нибудь из мира C++, пусть будет std::vector. не усложняй и без того сложную тему
Я и не рассматриваю.
Вот как раз про вектор — проясните, что тут имеется ввиду.
У стандартного вектора — семантика копирования.
В каких ситуациях может понадобиться семантика переноса?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Пример по семантике переноса
От: uzhas Ниоткуда  
Дата: 26.08.14 12:10
Оценка: 6 (1)
Здравствуйте, LaptevVV, Вы писали:


LVV>Вот как раз про вектор — проясните, что тут имеется ввиду.

LVV>У стандартного вектора — семантика копирования.
LVV>В каких ситуациях может понадобиться семантика переноса?

какой у тебя вообще уровень понимания ?
рекомендую начать с вики или SO: http://stackoverflow.com/questions/3106110/what-are-move-semantics
Re[4]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 12:20
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, LaptevVV, Вы писали:



LVV>>Вот как раз про вектор — проясните, что тут имеется ввиду.

LVV>>У стандартного вектора — семантика копирования.
LVV>>В каких ситуациях может понадобиться семантика переноса?

U>какой у тебя вообще уровень понимания ?


Ну, например, что такое ленивые вычисления — я прекрасно понимаю. И могу реализовать.
Проблем при чтении Александреску — не испытывал...
U>рекомендую начать с вики или SO: http://stackoverflow.com/questions/3106110/what-are-move-semantics
Спасибо, посмотрю.
Вопрос не в том, что я сам не понимаю. Вопрос придумать простой и понятный пример для объяснения студентам.
Вот с виртуальностью я долго мучился с примерами, пока не нашел пример у Шамиса в его книжке по С++Builder — очень просто и понятный...
И студенты с тех пор — тоже прекрасно СРАЗУ усваивают.
Вот и для семантики перехода хотелось бы придумать-поиметь аналогичный простой пример.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Пример по семантике переноса
От: jazzer Россия Skype: enerjazzer
Дата: 26.08.14 12:22
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, jazzer, Вы писали:


LVV>>>Не могли бы наши гуру предложить простой (дубовый, кондовый... ), но в то же время точно отражающий семантику переноса пример?


J>>std::vector. Все понимали с первого слова.

LVV>Что вектор?
LVV>Правильно ли я тебя понимаю,
LVV>что можно рассматривать использование динамической памяти вектором с использованием unique_ptr — как некий аналог семантики переноса?

Ну все знают, что вектор — это по сути просто указатель куда-то в кучу и красивый интерфейс к нему.
Поэтому рассматриваешь передачу вектора по значению в стандартном С++98 (через конструктор копирования по константной ссылке), обсуждаешь, почему такое не используется (потому что ненужная работа производится), а потом говоришь, что можно было бы передавать без потерь в скорости, если бы можно было просто перекинуть владение буфером в куче от одного объекта другому. Но что нормального способа это сделать в С++98 не было без специальных телодвижений (типа Boost.Move), потому что ты не знаешь, что тебе по константной ссылке пришло — объект, у которого можно все забрать или нормальный объект, который еще может использоваться где-то и должен оставаться нетронутым. А в С++11 есть rvalue-ссылки, которые автоматом распознают, когда такое можно делать, и просто перекидывают указатель.

А unique_ptr сам по себе такой же, просто у него вообще копирование запрещено.

Хотя, возможно, я неправильно понял твой вопрос.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 26.08.14 12:32
Оценка:
Здравствуйте, jazzer, Вы писали:

LVV>>Правильно ли я тебя понимаю,

LVV>>что можно рассматривать использование динамической памяти вектором с использованием unique_ptr — как некий аналог семантики переноса?

J>Ну все знают, что вектор — это по сути просто указатель куда-то в кучу и красивый интерфейс к нему.

J>Поэтому рассматриваешь передачу вектора по значению в стандартном С++98 (через конструктор копирования по константной ссылке), обсуждаешь, почему такое не используется (потому что ненужная работа производится), а потом говоришь, что можно было бы передавать без потерь в скорости, если бы можно было просто перекинуть владение буфером в куче от одного объекта другому. Но что нормального способа это сделать в С++98 не было без специальных телодвижений (типа Boost.Move), потому что ты не знаешь, что тебе по константной ссылке пришло — объект, у которого можно все забрать или нормальный объект, который еще может использоваться где-то и должен оставаться нетронутым. А в С++11 есть rvalue-ссылки, которые автоматом распознают, когда такое можно делать, и просто перекидывают указатель.

J>А unique_ptr сам по себе такой же, просто у него вообще копирование запрещено.


J>Хотя, возможно, я неправильно понял твой вопрос.

Спасибо, помедитирую.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Пример по семантике переноса
От: uzhas Ниоткуда  
Дата: 26.08.14 12:34
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Вопрос не в том, что я сам не понимаю. Вопрос придумать простой и понятный пример для объяснения студентам.


могу дать такие советы:
1) взять чье-либо объяснение и его разжевать. это проще, чем что-то самому выдумывать
2) для меня move — это аналог swap, просто реализованный на уровне языка (пусть и грубая аналогия, но для меня она первична). теперь задача сводиться к тому, чтобы объяснить зачем нужен swap =)
Re[5]: Пример по семантике переноса
От: saf_e  
Дата: 26.08.14 12:38
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, uzhas, Вы писали:


U>>Здравствуйте, LaptevVV, Вы писали:



LVV>>>Вот как раз про вектор — проясните, что тут имеется ввиду.

LVV>>>У стандартного вектора — семантика копирования.
LVV>>>В каких ситуациях может понадобиться семантика переноса?

U>>какой у тебя вообще уровень понимания ?

LVV>
LVV>Ну, например, что такое ленивые вычисления — я прекрасно понимаю. И могу реализовать.
LVV>Проблем при чтении Александреску — не испытывал...
U>>рекомендую начать с вики или SO: http://stackoverflow.com/questions/3106110/what-are-move-semantics
LVV>Спасибо, посмотрю.
LVV>Вопрос не в том, что я сам не понимаю. Вопрос придумать простой и понятный пример для объяснения студентам.
LVV>Вот с виртуальностью я долго мучился с примерами, пока не нашел пример у Шамиса в его книжке по С++Builder — очень просто и понятный...
LVV>И студенты с тех пор — тоже прекрасно СРАЗУ усваивают.
LVV>Вот и для семантики перехода хотелось бы придумать-поиметь аналогичный простой пример.

Попробуйте рассмотреть на примере std::swap для двух векторов (ну, или любых других объектов).

Ну и, как вариант, эстафетное владение. Т.е. unique_ptr или подобный объект.
Re: Пример по семантике переноса
От: Кодт Россия  
Дата: 26.08.14 13:03
Оценка: 24 (4)
Здравствуйте, LaptevVV, Вы писали:

LVV>Изучаю тут С++ для преподавания студентам.

LVV>И столкнулся с одной проблемой: не могу найти простого вменяемого примера для объяснения семантики переноса.

Эстафетное владение указуемым объектом (std::auto_ptr). В одном месте создали, в другое отдали, в старом забыли.

Физический пример: тачка с песком.
Передача по значению — это сделать новую тачку и насыпать туда такой же песок, как в исходной. Будет вдвое больше песка.
Передача по ссылке — отдать свою тачку в аренду.
Перемещение — высыпать песок из одной тачки в другую. Старую тачку выкинуть не немедленно, а в наиболее подходящий момент.

Можешь предложить студентам творческое задание: как передавать внутрь функции или возвращать из функции тяжеловесный объект (скажем, рукодельный вектор), не прибегая ни к копированию, ни к подсчёту ссылок. (А то на shared_ptr любой дурак сделает).
Скажи, что это нужно, скажем, для библиотеки линейной алгебры.
Перекуём баги на фичи!
Re: Пример по семантике переноса
От: zaufi Земля  
Дата: 26.08.14 15:09
Оценка: :))
Здравствуйте, LaptevVV, Вы писали:

LVV>Не могли бы наши гуру предложить простой (дубовый, кондовый... ), но в то же время точно отражающий семантику переноса пример?

LVV>Буду весьма признателен.

Голливудский сценарий:

Простой инженер КБ, будучи завербованным агентом иностранной разведки, выносит с работы USB флэшку (объект) набитую сверхсекретными чертежами и спецификациями. Он отдает (move) ее агенту, получает чемодан денег и оба скрываются во мраке ночи (ибо копировать 100500 гигов с флэшки в ноут агента очень долго, да и флэшка (как носитель) не стоит такого риска). Агент сам не может вывезти ее через границу, поэтому одтает (move) флэшку (объект) дип. курьеру в консульстве своей страны. В полете у курьера случается сердечный приступ, а флэшка (объект) попадает (move) в руки стюардессы -- агента военной разведки третьей страны, которая подсыпала что-то в стакан курьеру. Сразу после приземления, стюардесса едет на конспиративную квартиру, где происходит копирование (та самая процедура, которая занимает 100500 минут) этой флэшки на несколько других носителей. После чего, флэшка уже не нужна и уничтожается (delete flashka.

Дальше, по закону жанра, в кадре появляется главный герой, который до конца фильма мочит (terminate) всех, кто хоть что-то знает про информацию с флэшки %)
перемещая (move) всех на своем пути в мир иной %)
Re[2]: Пример по семантике переноса
От: uzhas Ниоткуда  
Дата: 26.08.14 15:22
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Дальше, по закону жанра, в кадре появляется главный герой, который до конца фильма мочит (terminate) всех, кто хоть что-то знает про информацию с флэшки %)

Z>перемещая (move) всех на своем пути в мир иной %)

есть соответствующий драфт на включение std::move_to_null в стандарт языка и его небросающей версии в случае std::terminate
читать здесь http://www.open-std.org/jtc1/sc22/wg21/ и здесь http://www.open-std.org/jtc1/sc22/wg21/docs/mailings/
Re[3]: Пример по семантике переноса
От: rus blood Россия  
Дата: 26.08.14 19:59
Оценка: 1 (1) +1
Здравствуйте, LaptevVV, Вы писали:

LVV>В каких ситуациях может понадобиться семантика переноса?


Возьми как пример вектор строк.
И ситуацию, когда этот вектор должен выполнить релокацию — добавили новую строку, а места в буфере вектора для нее нет.
Как выполняется релокация с обычным копированием:
1. создается новый буфер увеличенного размера,
2. строки из старого буфера копируются в новый (создаются копии),
3. строки в старом буфере удаляются,
4. удаляется старый буфер.

Копирование одной строки на шаге 2 влечет создание буфера в новом объекте-строке и копирование содержимого из старого в новый.
При этом, буфер старого объекта-строки просто удаляется на шаге 3.

Вместо этого, новый объект-строка мог бы просто забрать себе адрес массива символов старого объекта, а указатель на этот массив в старом объекте-строке просто занулить, чтобы деструктор не удалил этот массив.
Это и делает семантика переноса класса строки.
Имею скафандр — готов путешествовать!
Re: Пример по семантике переноса
От: Abyx Россия  
Дата: 26.08.14 21:06
Оценка: 20 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Изучаю тут С++ для преподавания студентам.

LVV>И столкнулся с одной проблемой: не могу найти простого вменяемого примера для объяснения семантики переноса.
LVV>Теоретически все понятно: кода мы переносим файл, то сам файл с места не сдвигается, а меняется только управляющая информация.

как мне кажется, тут надо начинать с категорий выражений — всякие xvalue/prvalue
потом изучать как передаются параметры в конструкторы и прочие функции
потом становится понятно что если в функцию передали неконстантную ссылку, то мы можем взять из нее одни данные, а взамен положить другие
а дальше и перенос становится логичным и понятным

или может стоит сначала рассказать про замену копирования на swap

void f(X& a) {
  X b = ...;
  swap(a, b);
}


а потом сказать что вместо вызова swap руками есть мув-семантика
void f(X& a) {
  X b = ...;
  a = move(b);
}
In Zen We Trust
Re[5]: Пример по семантике переноса
От: VladFein США  
Дата: 26.08.14 21:59
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Вопрос не в том, что я сам не понимаю. Вопрос придумать простой и понятный пример для объяснения студентам.


Есть гипотеза что тот, кто не может объяснить, сам не до конца понимает.

Ну и анекдотическое приложение к этому:
— Я ему объяснял, объяснял, уже сам понял, а он — никак.
Re[2]: Пример по семантике переноса
От: LaptevVV Россия  
Дата: 27.08.14 04:30
Оценка:
Здравствуйте, Abyx, Вы писали:

A>или может стоит сначала рассказать про замену копирования на swap

A>а потом сказать что вместо вызова swap руками есть мув-семантика
Вот! Кажись то, что нужно!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.