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