私は最近、Bjarne Stoustrup との講義に参加しました。彼は C++ 11 と、それが理にかなっている理由について話していました。
新しい素晴らしさの彼の例の 1 つは、ムーブ コンストラクターのニュース '&&' 記号でした。
それから私は家に帰りたいと思い始めました。
私の最初の例は以下のコードでした:
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 でラップすることでうまくいきましたが、考え続けました。
演算子算術の移動コンストラクターの引数は、実際には失敗した引数ですか?
コピー コンストラクターが呼び出されないのはなぜですか? で呼び出されるのはなぜですか :
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
は有害であるように見えますか?