Возврат объекта класса из функции по значению
Рассмотрим случай, когда вы возвращаете объект класса из функции по ценить. В этом сценарии возвращаемый объект обычно считается lvalue, то есть у него есть имя и адрес в памяти. Однако при определенных обстоятельствах возвращаемый объект может рассматриваться как rvalue, временный объект без имени или адреса.
Правило неявного перемещения
C определяет неявное правило перемещения, которое может применяться при возврате объекта по значению. Это правило гласит, что при выполнении следующих условий:
В таких случаях вместо конструктор копирования. Такое поведение предназначено для оптимизации производительности за счет предотвращения ненужного копирования.
Пример 1
В этом примере возвращаемый объект i является lvalue, поэтому тест конструктора копирования( const test& z) вызывается:
class test {
public:
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
test i;
return i;
}
Вывод:
test() test(const test&z)
Пример 2
Однако в следующем примере возвращаемый объект i обрабатывается как значение x, а конструктор перемещения test( test&& s) вызывается, поскольку объект является временным и конструктор перемещения жизнеспособен:
class test {
public:
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(test&& s) { printf("test(test&& s)\n"); }
};
test Some_thing() {
test i;
return i;
}
Вывод:
test() test(test&& s)
Пример 3
Если конструктор перемещения не указан или явно удален, правило неявного перемещения невозможно применить, и программа не сможет скомпилироваться:
class test {
public:
test(test&& z) = delete;
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(const test& z) { printf("test(const test&z)\n"); }
};
test Some_thing() {
test i;
return i;
}
Заключение
При возврате объекта по значению при определенных условиях может применяться неявное правило перемещения, в результате чего вызывается конструктор перемещения. Понимание этого поведения имеет решающее значение для оптимизации кода и предотвращения ошибок компиляции.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3