Недавно я был на лекции с Бьярне Стуступом, он говорил о C++ 11 и почему это имело смысл.Именно поэтому конструктор перемещения в C++ 11 имеет смысл?
Одним из его примеров новой удивительности была новость «& &» символ для перемещения конструкторов.
Затем я хочу домой и начал думать: «Когда мне когда-нибудь понадобится такая штука?».
Мой первый пример был ниже код:
class Number {
private:
int value;
public:
Number(const int value) : value(value){
cout << "Build Constructor on " << value << endl;
}
Number(const Number& orig) : value(orig.value){
cout << "Copy Constructor on " << value << endl;
}
virtual ~Number(){}
int toInt() const{
return value;
}
friend const Number operator+(const Number& n0, const Number& n1);
};
const Number operator+(const Number& n0, const Number& n1){
return Number(n0.value + n1.value);
}
int main(int argc, char** argv) {
const Number n3 = (Number(2) + Number(1));
cout << n3.toInt() << endl;
return 0;
}
Этот код делает именно то, что конструктор шаг должен решить. Переменная n3 построена из ссылки на значение, возвращаемое оператором «+».
Кроме этого есть выход из работы коды:
Build Constructor on 1
Build Constructor on 2
Build Constructor on 3
3
RUN SUCCESSFUL
Что выход показывает, что конструктор копирования никогда не вызывается - и это с оптимизациями выключены. Мне тяжело перекручивать руку кода достаточно, чтобы заставить запустить консоль. обертывание результата в std :: pair сделало трюк, но это заставило меня задуматься.
Является ли аргумент move-constructors в операторной арифметике фактически неудачным аргументом?
Почему is'nt мой конструктор копирования называется и почему он называется в:
using namespace std;
class Number {
private:
int value;
public:
Number(const int value) : value(value){
cout << "Build Constructor on " << value << endl;
}
Number(const Number& orig) : value(orig.value){
cout << "Copy Constructor on " << value << endl;
}
virtual ~Number(){}
int toInt() const{
return value;
}
friend const std::pair<const Number, const Number> operator+(const Number& n0, const Number& n1);
};
const std::pair<const Number, const Number> operator+(const Number& n0, const Number& n1){
return make_pair(Number(n0.value + n1.value), n0);
}
int main(int argc, char** argv) {
const Number n3 = (Number(2) + Number(1)).first;
cout << n3.toInt() << endl;
return 0;
}
С выходом:
Build Constructor on 1
Build Constructor on 2
Copy Constructor on 2
Build Constructor on 3
Copy Constructor on 3
Copy Constructor on 2
Copy Constructor on 3
Copy Constructor on 2
Copy Constructor on 3
3
RUN SUCCESSFUL
Я хотел бы знать, что логика и почему оператор пары в основном завинчивает производительность?
обновление:
Я сделал еще одну модификацию и обнаружил, что если я заменил make_pair
с фактическим шаблонного конструктора пары pair<const Number, const Number>
это уменьшило количество раз конструктор копирования был уволен:
class Number {
private:
int value;
public:
Number(const int value) : value(value){
cout << "Build Constructor on " << value << endl;
}
Number(const Number& orig) : value(orig.value){
cout << "Copy Constructor on " << value << endl;
}
virtual ~Number(){}
int toInt() const{
return value;
}
friend const std::pair<const Number, const Number> operator+(const Number& n0, const Number& n1);
};
const std::pair<const Number, const Number> operator+(const Number& n0, const Number& n1){
return std::pair<const Number, const Number>(Number(n0.value + n1.value), n0);
}
int main(int argc, char** argv) {
const Number n3 = (Number(2) + Number(1)).first;
cout << n3.toInt() << endl;
return 0;
}
:
Build Constructor on 1
Build Constructor on 2
Build Constructor on 3
Copy Constructor on 3
Copy Constructor on 2
Copy Constructor on 3
3
RUN SUCCESSFUL
Таким образом, это будет груша с использованием make_pair
вредно?
Я только что проверил первый пример, и я получил бесконечный рекурсивный цикл в 'operator +': is добавляет 'int' и' Number', 'int' по умолчанию преобразуется в' Number' и то все начинается снова. – rodrigo
Конструктор перемещения имеет смысл только для классов, управляющих внешними данными. Содержимое самих данных объекта * всегда * копируется, так или иначе. –
@rodrigo: В примере была опечатка, я исправил ее. –