Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 17:58
Оценка: +2 -9
Я преподаю С++ студентам пару лет и неизменно вижу круглые непонимающие глаза когда я рассказываю о копировании, о том, что тут передача по значению, тут по ссылке, а тут вообще по константной ссылке. Когда же после этого речь заходит про перемещение, то у части эмоционально нестойких начинается нервный тик. Итак мои тезисы: копирование и перемещение неоправданно сложны, не интуитивны, приводят к снижению быстродействия и ошибкам. Передача объектов по ссылке на объект всегда достаточна.

Основные случаи где это надо:

1. Получить копию. Но явное лучше неявного, поэтому метод clone гораздо лучше. Да, уже не напишешь bigint или комплексное число с которым удобно работать как с примитивными типами, но почему эти типы просто не сделать частью языка?

2. Умные указатели. Должны быть частью языка и все будет ок.

Обоснуйте почему копирование и перемещение это не WTF, а классно, чтобы я смог студенту обосновать, что все сделано правильно.
Re: Зачем нужно копирование/перемещение
От: Ops Россия  
Дата: 09.08.17 18:06
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Обоснуйте почему копирование и перемещение это не WTF, а классно, чтобы я смог студенту обосновать, что все сделано правильно.


Потому что время жизни объектов ограничено, и передать их вовне по ссылке нельзя?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 18:13
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Потому что время жизни объектов ограничено, и передать их вовне по ссылке нельзя?


В чем проблема?

object o;
foo(o.clone());
Re: Зачем нужно копирование/перемещение
От: Vamp Россия  
Дата: 09.08.17 18:28
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Обоснуйте почему копирование и перемещение это не WTF, а классно, чтобы я смог студенту обосновать, что все сделано правильно.

А зарплату мы тоже за тебя пойдем получать?

MTD>Я преподаю С++ студентам пару лет и неизменно вижу круглые непонимающие глаза когда я рассказываю о копировании, о том, что тут передача по значению, тут по ссылке, а тут вообще по константной ссылке.

Плохо преподаешь, значит. Раз глаза круглеют.

MTD>Когда же после этого речь заходит про перемещение, то у части эмоционально нестойких начинается нервный тик. Итак мои тезисы: копирование и перемещение неоправданно сложны, не интуитивны,

С++ вообще неоправданно сложен не интуитивен. Вот бургеры переворачивать в МакДональдспе — просто и интуитивно.

MTD>приводят к снижению быстродействия и ошибкам. Передача объектов по ссылке на объект всегда достаточна.

Нет. Не всегда.

MTD>Основные случаи где это надо:


MTD>1. Получить копию. Но явное лучше неявного, поэтому метод clone гораздо лучше. Да, уже не напишешь bigint или комплексное число с которым удобно работать как с примитивными типами, но почему эти типы просто не сделать частью языка?

Потому, что тогда язык станет равен множеству программ, написанных на нем.

MTD>2. Умные указатели. Должны быть частью языка и все будет ок.

Они и так часть языка. Стандартная библиотека входит в стандарт.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 18:34
Оценка: +4
Здравствуйте, Vamp, Вы писали:

V>А зарплату мы тоже за тебя пойдем получать?

V>Плохо преподаешь, значит. Раз глаза круглеют.
V>С++ вообще неоправданно сложен не интуитивен. Вот бургеры переворачивать в МакДональдспе — просто и интуитивно.

Печально, что вместо конструктивного обсуждения, интеллекта хватило только для перехода на личности.
Re[3]: Зачем нужно копирование/перемещение
От: Vamp Россия  
Дата: 09.08.17 19:04
Оценка: +2
MTD>Печально, что вместо конструктивного обсуждения, интеллекта хватило только для перехода на личности.
Какое может быть конструктивное обсуждение с человеком, который врывается с шашкой наголо и начинает ей махать — копирование не нужно! Хрясь! Перемещение не нужно! Хрясь! Даешь Clone! Фигак! С таким человеком серьезно разгововаривать невозможно. Ты прочти сначала базовый минимум, ну например, Design and Evolution of C++ (а если читал — продемонстрируй понимание предмета в вопросе), а потом уже давайте "советы космического масштаба".
Да здравствует мыло душистое и веревка пушистая.
Re: Зачем нужно копирование/перемещение
От: andyp  
Дата: 09.08.17 19:09
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Обоснуйте почему копирование и перемещение это не WTF, а классно, чтобы я смог студенту обосновать, что все сделано правильно.


Все уже в Elements of Programming, глава 1 обосновано. Просто начинать надо с value semantics и определений, что есть тип, что есть объект, что есть его представление, что такое равенство объектов, что происходит при присваивании. Про regular types можно сказать. Тогда и проблем с копированием и перемещением не возникнет. Ты ж С++ рассказываешь или где?
Re: Зачем нужно копирование/перемещение
От: kov_serg Россия  
Дата: 09.08.17 19:15
Оценка: +2
Здравствуйте, MTD, Вы писали:

MTD>Я преподаю С++ студентам пару лет и неизменно вижу круглые непонимающие глаза когда я рассказываю о копировании, о том, что тут передача по значению, тут по ссылке, а тут вообще по константной ссылке. Когда же после этого речь заходит про перемещение, то у части эмоционально нестойких начинается нервный тик. Итак мои тезисы: копирование и перемещение неоправданно сложны, не интуитивны, приводят к снижению быстродействия и ошибкам. Передача объектов по ссылке на объект всегда достаточна.


Видимо вы им слишком быстро этот ушат выливаете. Обучение должно строится последовательно. Надо слона есть по частям.
С++ сложный язык и программа по его изучению не может быть быстрой и простой.
Преподавть сначала C, алгориты, структуры данных, как огранизовывать код особенно когда его очень много, как выстраивать процесс разработки, как работать с чужим кодом. Показать чем практика отличается от теории.
И только потом уже C++ и другие языки и инструменты причем тоже постепенно, иначе неподготовленный мозг такое пропустет мимо.
Не просто почему такая конструкция есть, а расказать причины её появления.
В частность операция перемещения это просто желание убрать лишние операции при передаче результата.
Re[2]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 19:32
Оценка:
Здравствуйте, andyp, Вы писали:

A>Все уже в Elements of Programming, глава 1 обосновано.


Эта? https://www.amazon.com/Elements-Programming-Alexander-Stepanov/dp/032163537X

Пролистал не нашел ответа на мой вопрос.

A>Просто начинать надо с value semantics и определений, что есть тип, что есть объект, что есть его представление, что такое равенство объектов, что происходит при присваивании. Про regular types можно сказать. Тогда и проблем с копированием и перемещением не возникнет.


Что такое копирование понятно. Непонятно зачем оно нужно, когда без него можно прекрасно обойтись.
Re: Зачем нужно копирование/перемещение
От: torvic Голландия  
Дата: 09.08.17 19:32
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Я преподаю С++ студентам пару лет....

первым языком?
Re[2]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 19:34
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Видимо вы им слишком быстро этот ушат выливаете. Обучение должно строится последовательно. Надо слона есть по частям.


Проблем с пониманием, что такое копирование нет. Вопросы зачем это нужно.

_>В частность операция перемещения это просто желание убрать лишние операции при передаче результата.


Это понятно и на это студенты резонно замечают, что не было бы копирования не надо было бы и костылей в виде перемещения.
Re[2]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 19:35
Оценка:
Здравствуйте, torvic, Вы писали:

MTD>>Я преподаю С++ студентам пару лет....

T>первым языком?

Нет, они уже как правило много чего еще знают, поэтому и недоумевают зачем в С++ так сделано.
Re[4]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 09.08.17 19:38
Оценка: -1
Здравствуйте, Vamp, Вы писали:

V>Какое может быть конструктивное обсуждение с человеком, который врывается с шашкой наголо и начинает ей махать — копирование не нужно!


Если сказать нечего, ступай мимо.

V>Даешь Clone!


Но это же реально было бы лучше и костыль в виде move семантики не потребовался.

V>Ты прочти сначала базовый минимум, ну например, Design and Evolution of C++ (а если читал — продемонстрируй понимание предмета в вопросе), а потом уже давайте "советы космического масштаба".


Ты видимо тоже хочешь рассказать, что такое копирование — спасибо, не надо, это понятно. Непонятно зачем. Думаю перемудрил Страуструп, а потом было поздно.
Re: Зачем нужно копирование/перемещение
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 09.08.17 19:51
Оценка: +4
Здравствуйте, MTD, Вы писали:

MTD>Обоснуйте почему копирование и перемещение это не WTF, а классно, чтобы я смог студенту обосновать, что все сделано правильно.


Студентам я бы порекомендовал читать оригинал, то есть книгу "Язык программирования С++" Бьерна Страуструпа (3-е или специальное издание), в данном случае 5 глава "Указатели, массивы и структуры", а не вольное изложение. Даю определения из книги.

5.1 Указатели
Для данного типа T, тип T* является "указателем на T". То есть переменная типа T* содержит адрес объекта типа T.

5.5 Ссылки
Ссылка (reference) является альтернативным именем объекта.
...
Очевидной реализаций ссылки является (константный) указатель, при каждом использовании которого происходит разыменование. Большого вреда в такой интерпретации ссылки нет, но при этом надо помнить, что ссылка, в отличие от указателя не является объектом, над которым можно выполнять операции.


Ссылка это альтернативное имя объекта и не более, а указатель это объект содержащий адрес. А раз указатель это объект, то и выставить адрес можно в ноль или другое значение.

Вот чисто для примера, у меня два массива, один массив указателей, а другой массив неких объектов. Я могу просто взять и тупо обменять два указателя местами. А теперь вопрос, что вы сможете сделать со ссылками, если это просто альтернативное имя объекта? Даже если есть копирующий конструктор или другая функция, то копировать весь объект может оказаться гораздо дольше указателя.

Опять же какие сложности с константами, то есть по-русски постоянными? Как и сказано в книге читается в обратном порядке от того, что написано в коде:
1. указатель — можно изменять адрес и объект на который он ссылается
2. указатель на константу — можно изменять адрес, но не объект на который он ссылается
3. константный указатель — нельзя изменять адрес, но можно менять объект на который он ссылается
4. константный указатель на константу — нельзя изменять ни адрес, ни объект на который он ссылается

Всё это можно представить в виде традиционной таблицы 2x2 дополнительно с названиями строк и столбцов. А ссылки соответственно:

1. ссылка
2. ссылка на константу

Что касается умных указателей, то они были в бусте и многих других библиотеках, а теперь входят в стандарт. Тот же Qt имеет реализацию умного указателя, но не только, можно автоматически грохать (освобождать память) объекты в конечном итоге наследованные от QObject и включённые в иерархию (родитель/потомок), при этом порядок удаления изменится нежели с умным указателем. И более того, умные указатели в данном случае не нужны.

У меня до 200 книг по C++, не сказал бы что читал или даже листал их все, но термин перемещение что-то особо не припомню чтобы использовался для объяснения управления памятью. В принципе, есть стек и куча, и то и другое в конечном счёте находится в оперативной памяти, но работает по-разному. Выбираете где хотите создать объект и создаёте.

А студенты в подавляющем большинстве случаев и вовсе пойдут работать не по специальности. Им этот C++ и даром не сдался, так что наверное можно и не напрягаться объясняя им как создать самую быструю битомолку. А всё это придумано именно, что для скоростной обработки данных при минимальных затратах памяти.

Плюс вот лично я не понимаю смысл сборщика мусора. Идея понятна, реализация понятна, а зачем его сделали, когда это неэффективно непонятно. Как неумение управлять памятью облегчает жизнь программиста тоже непонятно, тем более сборщиком мусора тоже можно управлять. При этом C++ это далеко не Си в котором и с памятью работали по другому и не было парадигм ООП и обобщённого (шаблоны C++) программирования.

Вот мои тезисы: если программист дерьмовый, а я между прочим тоже довольно посредственный, то он налажает в любом случае, какой ему существующий язык не дай, только на многих реализациях языков всё это ещё будет работать очень и очень медленно. В C++ дали и прямое управление памятью и не прямое, там и так можно и сяк, есть целые библиотеки у которых только одно назначение управлять памятью самым эффективным образом, а людям всё не нравится. Вот они ноют, урежьте возможности, слишком многа букв, ниасилил. Я вот тоже не осилил, потому что C++ это язык с избыточной функциональностью, да и часто не до него, но я хотя бы понимаю, что это именно возможности.
Re[3]: Зачем нужно копирование/перемещение
От: andyp  
Дата: 09.08.17 19:51
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Эта? https://www.amazon.com/Elements-Programming-Alexander-Stepanov/dp/032163537X


MTD>Пролистал не нашел ответа на мой вопрос.


Да, эта. Странно. Впрочем, ты мог посчитать ответ нерелевантным, хотя для меня связь value semantics и перемещения-копирования очевидна. Там же обсуждаются well formed и partilly formed objects. После того, как эти концепции поняты студентом, перемещение никаких вопросов вызывать не должно.

MTD>Что такое копирование понятно. Непонятно зачем оно нужно, когда без него можно прекрасно обойтись.


Я предпочитаю себя так не ограничивать. Весь С++ вокруг value semantics вертится.
Re[3]: Зачем нужно копирование/перемещение
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.08.17 20:05
Оценка:
Здравствуйте, MTD, Вы писали:


MTD>Что такое копирование понятно. Непонятно зачем оно нужно, когда без него можно прекрасно обойтись.


Заменив костылем "clone"? Ну-ну
Маньяк Робокряк колесит по городу
Re: Зачем нужно копирование/перемещение
От: reversecode google
Дата: 09.08.17 20:11
Оценка:
Здравствуйте, MTD, Вы писали:

https://youtu.be/oQDOqB1asNw?t=99
с привязкой ко времени, — а зачем это надо ?
но можете и весь доклад посмотреть
Re[5]: Зачем нужно копирование/перемещение
От: Vamp Россия  
Дата: 09.08.17 21:20
Оценка:
V>>Ты прочти сначала базовый минимум, ну например, Design and Evolution of C++ (а если читал — продемонстрируй понимание предмета в вопросе), а потом уже давайте "советы космического масштаба".

MTD>Ты видимо тоже хочешь рассказать, что такое копирование — спасибо, не надо, это понятно. Непонятно зачем. Думаю перемудрил Страуструп, а потом было поздно.

Ты книжку прочти сначала. Потом поговорим. Ладно, вот тебе для затравки — в каких случаях копирование быстрее, чем передача по ссылке? Когда узнаешь ответ, приходи — поговорим.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Зачем нужно копирование/перемещение
От: Vamp Россия  
Дата: 09.08.17 21:21
Оценка:
A>После того, как эти концепции поняты студентом, перемещение никаких вопросов вызывать не должно.
Как они могут быть поняты студентом, если они не поняты преподавателем, который и не желает их понимать?
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Зачем нужно копирование/перемещение
От: MTD https://github.com/mtrempoltsev
Дата: 10.08.17 03:26
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Ты книжку прочти сначала. Потом поговорим.


Прикольно у тебя подгарает — аргументов нет, но поумничать жуть как хочется.

V>Ладно, вот тебе для затравки — в каких случаях копирование быстрее, чем передача по ссылке? Когда узнаешь ответ, приходи — поговорим.


Если ты про регистры, то лужа снова стерпит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.