補足・プログラミング言語 ++C ?

C言語には、++演算子と–演算子なる物があります。

でもってこの演算子ですが、i++; と ++i; の2つの書式が存在します。

と言う話の補足です。

(因みに、–演算子は、- -です。何故か繋がって1本になっちゃってます…)

i++;(後置) の場合…
int ++( int& i ){
  int tmp = i;
  i = i + 1;
  return tmp;
}

++i;(前置) の場合…
int ++( int& i ){
  i = i + 1;
  return i;
}

前回、こんな感じの仮想コードを書きましたが、あくまで仮想コードなので、実際にはコンパイルが通りません。

じゃぁ、動くコードで書くとどうなるのかというと、こんな感じです。

class foo{
public:
  foo(): m_value(0){}
  foo( const foo& rhs ): m_value(rhs.m_value){}
  ~foo(){}

  // 前置++
  foo& operator ++(){
    m_value = m_value + 1;
    return *this;
  }
  // 後置++
  foo operator ++( int ){
    foo tmp = *this;
    m_value = m_value + 1;
    reutrn tmp;
  }

private:
  int m_value;
};

前置++ の場合は、1加えて、自分自身の参照をリターンしてますが、後置++ の場合は、自分自身をコピーした値をリターンしています。

ということで、まず最初にコピーする段階でコピーコンストラクタが働きます。

でもって、リターンする際にコピーコンストラクタが働き、更にコピーしたものを破棄するので、デストラクタが働きます。

更に、戻り値を受け取らないと、戻り値としてわざわざコピーした物を破棄するので、もう1回デストラクタが働きます。

というわけで、後置++ を繰り返し使うと、CPUの稼働率が上がってしまい、地球環境にちっとも優しくないプログラムとなってしまうのです。

因みにこのことを知ったのは、10年以上前に読んだ「Exceptional C++」 という書籍でした。

カテゴリー: 独り言   パーマリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>