170 похожих чатов

Здравствуйте! Прошу рассказать, а не слать гуглить! У Майерса в

книжке про эффективный и своременный с++ (14 стандарт) написано, что если объявить перемещающий коструктор как noexept, то скажем vector при расширении, элементы будет не копировать, а перемещать. Как я понял по описанию, что компилятор генерирует оператор перемещения как обычный, без noexcept. Это так? типо получается для своих кастомных классов, которые ты в контейнер запихиваешь, стоит точно этот конструктор определять? И ещё если сработал конструктор перемещения, то он типо переместил объект, и не будет вызван деструктор? Или всё-таки, как бы прошлый объект который попал в перемещающий конструктор разрушится? А как тут дела с памятью, он даже если пустой, что-то занимает? я вот с перемещением не могу понять, можете пояснить?

2 ответов

18 просмотров

Да, вы правильно поняли описание из книги про эффективный и современный C++ от Майерса. Давайте рассмотрим каждый аспект перемещения в C++ более подробно. Перемещение в C++ (move semantics) было введено в стандарте C++11 и предоставляет возможность эффективно перемещать объекты, вместо копирования, что может значительно улучшить производительность и экономить ресурсы. Ключевое слово noexcept: Когда объявляется перемещающий конструктор (или перемещающий оператор присваивания) как noexcept, это означает, что этот конструктор (или оператор) не будет выбрасывать исключения. Это позволяет использовать перемещающий конструктор в контекстах, где гарантировано требуется отсутствие исключений, например, при расширении контейнеров, таких как std::vector, которые требуют перемещения элементов. Компилятор и noexcept: Когда вы явно определяете перемещающий конструктор (или перемещающий оператор) в своем классе, компилятор не будет автоматически добавлять noexcept. Это нужно сделать явно: MyClass(MyClass&& other) noexcept { /* код перемещающего конструктора */ }. Перемещение и деструктор: Когда объект перемещается, перемещающий конструктор (или перемещающий оператор) забирает ресурсы (например, указатели на память) из исходного объекта и "оставляет" его в состоянии, пригодном для деструкции. Важно понимать, что перемещение не уничтожает старый объект, он лишь передает его ресурсы новому объекту. После перемещения, исходный объект может быть удален (его деструктор вызовется). Пустой объект и перемещение: Пустой объект (т.е., объект, у которого нет ресурсов, например, он не выделял память) может быть перемещен, и он не займет больше памяти, чем до перемещения. Перемещение в таком случае будет своего рода "перемещением нулевых ресурсов", которое может быть полезно для оптимизации. Если ваш класс имеет ресурсы, которые можно эффективно перемещать (например, владеет указателями на динамически выделенную память или другими ресурсами), реализация перемещающего конструктора (и перемещающего оператора присваивания) может значительно улучшить производительность при работе с контейнерами или передаче объектов между функциями. Однако, если ваш класс содержит только примитивные типы данных, то вероятнее всего, перемещающий конструктор не будет давать большой выигрыш в производительности.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта