Существует класс Complex с конструктором, который печатает сообщение для RVO.
Я тестировал метод оператора + метод в gtest.
Если произошел RVO, печатает "Complex !!" сообщений в 3 раза.
Но есть «Комплекс!» сообщений в 5 раз.
RVO не было, думаю.
Я скомпилировал этот код с помощью C++ 98 и C++ 11
Почему RVO не возникает?
Почему RVO не применяется в этом коде
#include <stdio.h>
class Complex {
friend Complex operator+(const Complex&, const Complex&);
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { printf("\nComplex!!\n");}
Complex(const Complex& c) : real(c.real), imag(c.imag) {}
Complex& operator=(const Complex& c) {
real = c.real;
imag = c.imag;
return *this;
}
~Complex() {}
private:
double real;
double imag;
};
Complex operator+(const Complex& lhs, const Complex& rhs)
{
return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);
}
int main()
{
Complex a(1.0), b(2.0), c;
for (int i = 0; i < 2; i++) {
c = a + b;
}
}
Существует 5 вызовов конструктора: по одному для инициализации 'a',' b' и 'c' и по одному для каждого вызова' operator + '. Почему вы думаете, что будет какой-то другой номер? Какие из них, по вашему мнению, не должны произойти? – immibis
RVO elides вызывает копирование конструкторов и перемещение конструкторов, а не других. Поэтому ваш код ничего не говорит о RVO. –
Это может произойти для 'Complex c = a + b;'. Теперь у вас есть задание, которое неприменимо. –