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

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ม.ค. 2025

ความคิดเห็น • 44

  • @userf155
    @userf155 หลายเดือนก่อน +6

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

  • @dimbo4ka213
    @dimbo4ka213 หลายเดือนก่อน +20

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

  • @ИнякинАлександр
    @ИнякинАлександр หลายเดือนก่อน +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 лежит на гитхабе (только у каждого реализация своя)

  • @ИЖ-Ю
    @ИЖ-Ю หลายเดือนก่อน +3

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

  • @Desotterro
    @Desotterro หลายเดือนก่อน +4

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

  • @donlinoleum831
    @donlinoleum831 หลายเดือนก่อน

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

  • @Mercury13kiev
    @Mercury13kiev หลายเดือนก่อน +2

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

  • @РоманКондратов-г1р
    @РоманКондратов-г1р หลายเดือนก่อน

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

  • @vilture5706
    @vilture5706 หลายเดือนก่อน

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

  • @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, и, лично я думаю, что именно эта причина была одна из основных в мотивации добавить именно новый вид ссылок для поддержки семантики перемещения.

  • @Vol_
    @Vol_ หลายเดือนก่อน +1

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

    • @userf155
      @userf155 หลายเดือนก่อน +2

      QtCreator

  • @biryuk666
    @biryuk666 หลายเดือนก่อน

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

  • @euhenydemida4456
    @euhenydemida4456 หลายเดือนก่อน +1

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

  • @cavesalamander6308
    @cavesalamander6308 หลายเดือนก่อน +4

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

    • @phusicus_404
      @phusicus_404 หลายเดือนก่อน

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

    • @denisgluk431
      @denisgluk431 วันที่ผ่านมา

      К хорошему привыкаешь. На циклы в индексами к сожалению на чукотскую писменность похож. Я часто писал на машинах, где компилятор с пол тыка не обновишь. Мне нормально на устаревшем коде делать. Но выглядит очень клипово, каких-то мелочей очень не хватает.

  • @kunak1197
    @kunak1197 หลายเดือนก่อน

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

  • @Тед-е8ы
    @Тед-е8ы หลายเดือนก่อน +1

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

  • @ted_res
    @ted_res หลายเดือนก่อน +1

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

    • @arekusei9580
      @arekusei9580 หลายเดือนก่อน

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

    • @ВикторГиль-ф2ф
      @ВикторГиль-ф2ф หลายเดือนก่อน

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

  • @DART2WADER
    @DART2WADER หลายเดือนก่อน

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

  • @Тед-е8ы
    @Тед-е8ы หลายเดือนก่อน +1

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

  • @Jeweler-228
    @Jeweler-228 หลายเดือนก่อน +2

    Звук отстает

    • @Slavasil
      @Slavasil หลายเดือนก่อน

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

  • @trevoro.9731
    @trevoro.9731 หลายเดือนก่อน

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

  • @Ma_X64
    @Ma_X64 หลายเดือนก่อน

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

  • @MichaelLenz1
    @MichaelLenz1 หลายเดือนก่อน

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

  • @ВсеволодПарфёнов-ф2ъ
    @ВсеволодПарфёнов-ф2ъ หลายเดือนก่อน

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

  • @romankuznetsov4601
    @romankuznetsov4601 หลายเดือนก่อน +1

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

    • @cavesalamander6308
      @cavesalamander6308 หลายเดือนก่อน +2

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