Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

2010年8月21日 #

[C++]右辺値参照の限界点

右辺値参照を調べてわかった事。

右辺値参照はオブジェクトのコピーをするときに
条件さえ整えば高速におこなう事を目的に作られた構文です。

右辺値参照が役に立つのは、関数内でポインタの形で情報を持っているものに限られます。
ですから、直接値を持つ形になっているクラスには何の貢献もしません。
具体的には、以下のような例です。

/* 役に立つ例 */
class MyString{
  char *string;
} 

/* 役に立たない例 */
class Matrix44{
  float m[4][4];
} 

下の例の行列なんかは演算子オーバーロードで書ければすっきりするのですが、
実際にはそういうわけにはいきません。

/* こんな関数は速くならない */
Matrix44 operator +(const Matrix44 &in1, const Matrix44 &in2); 

/* 現実的な解 */
void Add(Matrix &out, const Matrix44 &in1, const Matrix44 &in2); 

右辺値参照を最初に聞いた時、こんな事ができる!と期待してました。

/* 私がやりたかった事 */
auto operator +(const Matrix44 &in1, const Matrix44 &in2) -> Matrix44 &out{
  for(int x = 0; x < 4; x++){
    for(int y = 0; y < 4; y++){
      out[x][y] = in1[x][y] + in2[x][y];
    }
  }
}

返り値を受け取る変数って、関数を呼び出した時点で
破壊されているものとみなしてもいいと思うんですよ。(例外やlongjmpは無視)
そして、その返り値を受け取る変数の参照が欲しい!!

ということで名前付き返り値なんてものがあってもいいんじゃないかな~。
VBなんかが返り値は関数名と同名の変数に入れるタイプですね。

と思ってたら、どうやらReleaseモードでの最適化で似たような事をしてくれるらしいです。
(以下の記事のコメント欄参照)
http://blogs.wankuma.com/episteme/archive/2010/08/06/192085.aspx

…最適化してくれるのなら右辺値参照はいらない子なんじゃと思う今日この頃です。
コピー以外に使い道はあるんでしょうかね?

posted @ 11:14 | Feedback (9)