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

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

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

2 ответов

15 просмотров

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта