ゼロエックスって書くと、
新しいガンダムかと思いそうですが、C++ 0xの話です。
またプログラム知らない人にはごめんなさいな記事だよ!
C++ 0xにて色々な強化がされました。
コンセプト、ラムダ式、constexprなど
大きなものから小さなものまで。
コンセプトさんは死んじゃったけどね・・・。
で、その中の一つに「右辺値参照」があります。
んで、この「右辺値参照」の説明をしようと思ったんですが、
左辺値と右辺値ってなーに?ってところから
まともに詳しく書いていくとあまりに長く難解になりそうなんで
語弊を含む部分もあるかもしれませんが、省略して書いていきます。
左辺値と右辺値の違いは、式の終了後も
生存するオブジェクトかどうかです。
(左辺値=非一時オブジェクト、右辺値=一時オブジェクト)
int x = 1;
という式が存在した場合、
xは式の終了後も存続するオブジェクトですが、
右側の1は、式の終了時に破棄される一時オブジェクトです。
その為、上記の式の場合、xが左辺値、1が右辺値になります。
つまり、左辺値はいつでも見れる保存したエロ画像で、
右辺値は街中で見かけた偶然のパンチラみたいなものです。
int x = 1;
という式は偶然のパンチラを、咄嗟にケータイで撮って、
xというエロ画像として保存するという式なのです。
まったく女性の敵のような式ですね!
紳士的な俺は怒りを隠せません!ビキビキ
さて、非一時オブジェクトと一時オブジェクトに関して
次のような違いがあります。
void megane(int& aInt);
と言ったように、非constの参照を受け取るメソッドに
・非一時オブジェクトは渡すことができる
・一時オブジェクトは渡すことができない
というルールがあるのです。
エロ画像を他人に渡すことはできても、パンチラの記憶は
他人に渡せないのと一緒です。
で、上記のルールによって、
megane(1);
というような式は書けず、
int x = 1; ①
megane(x);
というような式を書く必要が出てきます。
折角コピーのオーバーヘッドをなくしたくて、参照にしても
実質一度ローカル変数に取らなければいけないのであれば、
①の部分で余計なコピーが発生しているのです。
で、右辺値参照というのは、
そのコピーを減らそうぜというもの。
void megane(int&& aInt);
とした場合、
megane(1);
を行うことが可能であり、また引数は値渡しではないので
余計なコピーは発生しないというものです。
ここでは説明しませんが、右辺値参照後の定石となりそうな
むーぶコンストラクタを実装することで、またさらに右辺値参照が
強力になったりします。
それはまた別の機会に。
※const参照ではなく、右辺値参照による利点は
まさにムーブコンストラクタで出てくるのですが、
高校の時の彼女が巨乳だったことを思い出したので、
それどころではなくなりました。
新しいガンダムかと思いそうですが、C++ 0xの話です。
またプログラム知らない人にはごめんなさいな記事だよ!
C++ 0xにて色々な強化がされました。
コンセプト、ラムダ式、constexprなど
大きなものから小さなものまで。
コンセプトさんは死んじゃったけどね・・・。
で、その中の一つに「右辺値参照」があります。
んで、この「右辺値参照」の説明をしようと思ったんですが、
左辺値と右辺値ってなーに?ってところから
まともに詳しく書いていくとあまりに長く難解になりそうなんで
語弊を含む部分もあるかもしれませんが、省略して書いていきます。
左辺値と右辺値の違いは、式の終了後も
生存するオブジェクトかどうかです。
(左辺値=非一時オブジェクト、右辺値=一時オブジェクト)
int x = 1;
という式が存在した場合、
xは式の終了後も存続するオブジェクトですが、
右側の1は、式の終了時に破棄される一時オブジェクトです。
その為、上記の式の場合、xが左辺値、1が右辺値になります。
つまり、左辺値はいつでも見れる保存したエロ画像で、
右辺値は街中で見かけた偶然のパンチラみたいなものです。
int x = 1;
という式は偶然のパンチラを、咄嗟にケータイで撮って、
xというエロ画像として保存するという式なのです。
まったく女性の敵のような式ですね!
紳士的な俺は怒りを隠せません!ビキビキ
さて、非一時オブジェクトと一時オブジェクトに関して
次のような違いがあります。
void megane(int& aInt);
と言ったように、非constの参照を受け取るメソッドに
・非一時オブジェクトは渡すことができる
・一時オブジェクトは渡すことができない
というルールがあるのです。
エロ画像を他人に渡すことはできても、パンチラの記憶は
他人に渡せないのと一緒です。
で、上記のルールによって、
megane(1);
というような式は書けず、
int x = 1; ①
megane(x);
というような式を書く必要が出てきます。
折角コピーのオーバーヘッドをなくしたくて、参照にしても
実質一度ローカル変数に取らなければいけないのであれば、
①の部分で余計なコピーが発生しているのです。
で、右辺値参照というのは、
そのコピーを減らそうぜというもの。
void megane(int&& aInt);
とした場合、
megane(1);
を行うことが可能であり、また引数は値渡しではないので
余計なコピーは発生しないというものです。
ここでは説明しませんが、右辺値参照後の定石となりそうな
むーぶコンストラクタを実装することで、またさらに右辺値参照が
強力になったりします。
それはまた別の機会に。
※const参照ではなく、右辺値参照による利点は
まさにムーブコンストラクタで出てくるのですが、
高校の時の彼女が巨乳だったことを思い出したので、
それどころではなくなりました。