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

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

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

2 ответов

6 просмотров

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
32
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
1
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Всем привет! У меня почему-то по-разному отображается TListView в Debug и Release режимах (FireMonkey)! При запуске под Win приложения TListView заливается программо. в Debug ...
Александр COM
8
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Hey there Which is the best Linux destro for developers (coding)? To my research on reddit, they said Linux mint is good for mid level spec and Ubuntu for high Lev hardwar...
Wiz 🪄
11
Карта сайта