ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目20 戻り値最適化の促進

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 More Effective C++ (AddisonーWesley professional co)

  • 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/06/29
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 129回
  • この商品を含むブログ (43件) を見る

項目20 戻り値最適化の促進

オブジェクトを返す関数は、効率重視の場合に邪魔となる。

有理数のためのoperator*を考える。

class Rational {
public:
  Rational(int numerator = 0, int denominator = 1);
  ...
  int numerator() const;
  int denominator() const;
};

const Rational operator*(const Rational& a, const Rational& b);

このoperator*は、任意の数値の積を返す。
参照やポインタで値を返すことはできず、必ずオブジェクトを生成することになる。

このように関数には必ずオブジェクトを返さなければならないものがある。
よって、値返しをやめようとするのではなく、テンポラリオブジェクトのコストに注意を払う。

const Rational operator*(const Rational& a, const Rational& b) {
  return Rational(a.numerator() * b.numerator(),
                  a.denominator() * b.denominator());
}

上記のようにコンストラクタ呼び出しを返すようにすると、

Rational a = 10;
Rational b(1, 2);

Rational c = a * b;  // テンポラリが作られない

このように書いたとき、cの領域に直接return文のオブジェクトを格納するよう、最適化可能になる。
C++コンパイラの「戻り値最適化」で局所テンポラリが削除される。