Основы семантики перемещения в с++

Поделиться
HTML-код
  • Опубликовано: 14 янв 2025

Комментарии • 43

  • @userf155
    @userf155 27 дней назад +5

    Вот такого блогера нам не хватало.

  • @dimbo4ka213
    @dimbo4ka213 Месяц назад +19

    бро, продолжай снимать дальше! это самый качественный контент по плюсам во всем снг

  • @ИнякинАлександр
    @ИнякинАлександр Месяц назад +33

    Самое главное в семантике перемещения это то, что std::move ничего не перемещает!

    • @R3v0ult
      @R3v0ult Месяц назад

      Если ты про то, что std::move обёртка над memmove, то да

    • @КириллЧе-я5ы
      @КириллЧе-я5ы Месяц назад +5

      @@R3v0ultвообще-то это обёртка над статик каст как правило…

    • @R3v0ult
      @R3v0ult Месяц назад +1

      @@КириллЧе-я5ы, да, но у него 3 перегрузки и только 1 из них это статик каст

    • @КириллЧе-я5ы
      @КириллЧе-я5ы Месяц назад

      @ а можно ссылочки, даже интересно, где реализуют таким образом вполне конкретную noexcept функцию, возвращающую по стандарту static_cast?.. хочу пополнить свой багаж знаний

    • @R3v0ult
      @R3v0ult Месяц назад

      @@КириллЧе-я5ы, исходный код STL открыт. Можешь посмотреть реализацию STL в Visual Studio, если у тебя она есть, если нету, то реализация STL от GCC лежит на гитхабе (только у каждого реализация своя)

  • @ИЖ-Ю
    @ИЖ-Ю Месяц назад +2

    Лайк автору за его разборы. Добовляет понимание, над чем и с чем придётся работать. Предоставляет понимание в программировании.

  • @Desotterro
    @Desotterro Месяц назад +4

    Классный канал. Спасибо тебе!

  • @donlinoleum831
    @donlinoleum831 26 дней назад

    Друг, огромное спасибо за видео!

  • @РоманКондратов-г1р
    @РоманКондратов-г1р Месяц назад

    Ооо. Новое видео. Круто. Очень полезно. Спасибо большое

  • @Mercury13kiev
    @Mercury13kiev Месяц назад +2

    Я их называю «временные ссылки». Злой шаблонщиной решить можно, но уровень языка хорош тем, что это может перемещать там, где раньше неявно копировалось (параметры, return), а также автоматически применять это для временных объектов.
    Да, рассказывая про forward, я говорю: снаружи функция требует временную ссылку. Но внутри (для безопасности - любая потеря данных хуже любой неоптимальности) параметр именованный, и потому std::move. По той же причине - выведением типов нельзя отличить T& от T&& - std::forward требует параметр.
    И ещё говорю, что move лишь говорит: «этот объект именованный, но, поверьте, его можно потрошить». Реальным потрошением занимается конструктор перемещения. Или любая другая функция с временной ссылкой.

  • @Vol_
    @Vol_ Месяц назад +1

    Обожаю плюсы! Всегда найдётся способ выстрелить себе в ногу. =)
    Хотелось бы, чтобы автор также упомянул о том, что компилятор может предоставлять конструктор и оператор перемещения по умолчанию при определённых условиях.
    Надеюсь, в будущих видео будут раскрыты юз-кейсы использования семантики перемещения и различные её нюансы. Например, особенности при использовании с виртуальными классами, когда мы перемещаем объект производного класса через объект базового класса.
    Если не секрет, какая IDE используется в видео?
    Спасибо за видео, однозначно лайк!

    • @userf155
      @userf155 27 дней назад +1

      QtCreator

  • @kirillpetrakov3282
    @kirillpetrakov3282 Месяц назад +1

    На самом деле, можно, частино, решить проблему перемещения, обходясь исключительно l-value ссылками, не "убивая" семантику копирования. Как верно заметили, семантика перемещения включает в себя как минимум перегрузку конструктора и оператора присваивания. Т.е. мы можем создать любой другой конструктор, так, чтобы он отличался от конструктора копирования. Например, можно ввести новый класс, который в себе хранит ссылку на источник перемещения, и, примем как соглашение, что данный адаптер нужно использовать, когда необходимо переместить объект:
    template
    struct Movable {
    T& movable;
    };
    Тогда можно сделать следующий конструктор
    class Example {
    public:
    Example(Example const&); // copy ctor
    Example(Movable&); // move-like ctor
    };
    Далее уже можно развить эту тему для более удобного использования, но, как я уже говорил, это может лишь частично решить проблему, так как будет не доступна возможность создавать временный обект, который передается сразу как аргумент. Т.е. без полноценной поддержки новых типов ссылок нельзя было бы корректно написать что-то вроде: Example e(std::move(Example()));
    Причина в том, что время жизни такого временного объекта можно продлить только через l-value ссылку на константу, а перемещение требует чтобы ссылка была как раз таки не константная. Возможно кому-то может показаться что в таком случае можно применить снятие константности через const_cast, но это уже прямо таки конкретный костыль, который может привести к UB, и, лично я думаю, что именно эта причина была одна из основных в мотивации добавить именно новый вид ссылок для поддержки семантики перемещения.

  • @vilture5706
    @vilture5706 Месяц назад

    Блин когда давно это знаешь, но кто то другой объясняет, то немного по-другому начинаешь понимать. Чаще это использовать буду.

  • @biryuk666
    @biryuk666 Месяц назад

    Ого! А я думал канал загнулся... Its alive!🎉

  • @euhenydemida4456
    @euhenydemida4456 Месяц назад +1

    Еще до std::move в примерах из видео, при инициализации срабатывала бы такая штука, copy elision. Тоже та еще хрень неочевидная…

  • @cavesalamander6308
    @cavesalamander6308 Месяц назад +4

    Я все еще сижу на с++99 и счастлив. И стал еще счастливее со времен бурных изменений языка, превративших его в какую-то клинопись, да еще и зашифрованную.

    • @phusicus_404
      @phusicus_404 Месяц назад

      Что ты пишешь? Где работаешь?

  • @Тед-е8ы
    @Тед-е8ы Месяц назад +1

    Если у вас такие большие объекты это либо одноразовая акция для инициализации или у вас что-то не так

  • @kunak1197
    @kunak1197 Месяц назад

    Про NRVO и RVO надо бы упомянуть. Из-за гарантированного NRVO при возврате по значению, надо положить результат во временную переменную и возвращать еë.
    Вопрос по контейнерам STL. Если у объекта - элемента контейнера move конструктор (или move assignment operator) обьявлен не noexcept, то будет использован copy конструктор (оператор)? Если да, то каким образом определяется, что нет объявления noexcept?

  • @DART2WADER
    @DART2WADER Месяц назад

    Ты ещё про declval и launder расскажи))) Тогда у кого-то протечёт)))

  • @Тед-е8ы
    @Тед-е8ы Месяц назад +1

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

  • @ted_res
    @ted_res Месяц назад +1

    Простите, я не сишник. А чем вызвано острое желание держать объекты в стеке? Можно без головной боли работать с указателями, и тогда никакие копирующие конструкторы в принципе не вызываются - копируется сам указатель.

    • @arekusei9580
      @arekusei9580 Месяц назад

      С памятью на стеке работа осуществляется быстрее

    • @ВикторГиль-ф2ф
      @ВикторГиль-ф2ф 25 дней назад

      @@arekusei9580 Это из за исключений, чтобы не потерять память. Исключения идут по стеку и освобождают выделенную память (RAII).

  • @Jeweler-228
    @Jeweler-228 Месяц назад +2

    Звук отстает

    • @Slavasil
      @Slavasil Месяц назад

      нормальные люди смотрят на фоне)

  • @trevoro.9731
    @trevoro.9731 Месяц назад

    Термин "вектор" ввели всего 2 человека без каких-либо на то научных оснований. Его нужно вообще убрать из программирования за исключением математических векторов.

  • @Ma_X64
    @Ma_X64 Месяц назад

    вроде ж после std17 это уже не нужОное?

  • @MichaelLenz1
    @MichaelLenz1 Месяц назад

    Какая же гадость этот ваш цпп

  • @ВсеволодПарфёнов-ф2ъ

    Это полный абзац.

  • @romankuznetsov4601
    @romankuznetsov4601 Месяц назад +1

    Убери здоровенный микрофон в другое место плиз

    • @cavesalamander6308
      @cavesalamander6308 Месяц назад +1

      - А куда его засунуть-то?
      - Поручик, молчать!!!