Конструктор Move не должен инициализировать элементы класса и базовые классы с помощью семантики копирования
Конструктор Move не должен инициализировать элементы класса и базовые классы с помощью семантики копирования.
В C++ операции перемещения передают владение ресурсами, а не дублируют сами ресурсы из исходного объекта в целевой объект. Поскольку конструкторы move не дублируют ресурсы, эти конструкторы быстрее, чем конструкторы copy. Рассмотрим этот код, где находится объект CopyTarget создается с копированием и объект MoveTarget создается из объекта Source.
class BigData{
//...
BigData(BigData&&){ //Move Constructor
//...
} copy constructed
BigData(const BigData&){ //Copy Constructor
//...
}
private:
std::map<int, std::string> BigBook;
};
int main(){
BigData Source;
BigData CopyTarget = Source;
BigData Movetarget = std::move(Source);
//...
}При копировании-конструировании CopyTarget, компилятор дублирует ресурс Source::BigBook от Source кому CopyTarget. После создания копии оба этих объекта имеют копию ресурса. BigBook. При конструировании Movetarget, компилятор передает право собственности на ресурс Source::BigBook кому MoveTarget. Поскольку перемещение-конструирование физически не дублирует ресурс, это происходит быстрее, чем копирование-конструирование.
Строительство - это стратегия оптимизации. Вы ожидаете, что перемещение-строительство дешевле и быстрее, чем копирование-строительство. Инициализация копирования элементов данных и базовых классов может сделать конструктор перемещения медленным и неэффективным, что снижает производительность программы. Разработчики ожидают, что в конструкции move-construction используется только семантика move. Неожиданное использование семантики копирования в конструкторах перемещения может привести к утечкам ресурсов и несогласованности в будущей разработке. При разработке конструкторов перемещения инициализируйте элементы данных и базовые классы с помощью семантики перемещения. Можно копировать-инициализировать скалярные элементы данных, не нарушая это правило.
Вы можете использовать std::move() для реализации семантики перемещения в коде. При использовании std::move() для перемещения объектов объявите объекты или элементы данных без квалификатора const. Дополнительные сведения см. в разделе AUTOSAR C++14 Rule A18-9-3.
Если конструктор перемещения не использует семантику перемещения для инициализации нескалярных элементов данных и базовых классов, Polyspace ® помечает ее объявление. Например, если конструктор перемещения инициализирует базовый класс с помощью конструктора по умолчанию вместо конструктора перемещения, Polyspace помечает объявление конструктора перемещения.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Специальные функции-члены |
| Категория: Обязательно, Автоматизировано |