lambdaさんの日常

#include <iostream>
using namespace std;

int main(){
 auto lambda =
  []()->bool
 {
  static int i=0;
  cout << i++ << endl;
  if(i <= 20)
   return true;
  else
   return false;
 };

 while( lambda() );
}

出力結果

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

便利なんだけど、このstatic intってlambda式を生成するたびにメモリ上に確保されるん?
そうだとするなら、コレ解放されない領域が延々と生成される事になるんじゃ……。

                                        • -

追記:
よく考えたらlambdaで生成してるのはインスタンスなんだから、インスタンスを破棄すれば大丈夫な気がしてきた
追追記:
やっぱ駄目な気がしてきた
そのうち検証しよう

                                                            • -

後日談:
>関数オブジェクトのスタティックメンバなんだから、普通にひとつだけでしょう
というコメントが来たので、「あ。まあ、確かにそうだよね……」とか思いながら適当なコード書いて実行した、ら。

#include <iostream>
using namespace std;

int main()
{
  auto a = [](){
    static int i=0;
    i++;
    cout << i << endl;
  };
  auto b = [](){
    static int i=0;
    i++;
    cout << i << endl;
  };
  a();
  b();
  a();
  b();


  auto c = [](){
    static int i=0;
    i++;
    cout << i << endl;
  };

  auto d = c;
  c();
  d();
  c();
  d();

  return 0;
};

結果:

1
1
2
2
1
2
3
4

…………ほほー。
もしかしたら同じ内容の関数オブジェクトだから最適化されるかなーとか思ったけど、そんなことなかったぜ!
(もちろん、もしこれが最適化とかで同一視されると、色々と困った問題が出てくるので当然の帰結ではある)
もうちょっと挙動を見たいのでもう一つコード書いた。

#include <iostream>
#include <vector>
#include <functional>
using namespace std;

std::function<void ()> create_func_objectA(){
	return [](){
		static int temp[1000] = {0};
		temp[0]++;
		cout << temp[0] << endl;
	};
}

std::function<void ()> create_func_objectB(){
	return [](){
		static int temp[1000] = {0};
		temp[0]++;
		cout << temp[0] << endl;
	};
}

int main()
{
	vector<function<void ()>> v;
	v.push_back( create_func_objectA() );
	v.push_back( create_func_objectA() );
	v.push_back( create_func_objectA() );
	v.push_back( create_func_objectA() );
	v.push_back( create_func_objectA() );
	v.push_back( create_func_objectB() );
	v.push_back( create_func_objectB() );
	v.push_back( create_func_objectB() );
	v.push_back( create_func_objectB() );
	v.push_back( create_func_objectB() );

	for(size_t i=0; i < v.size(); ++i){
		v[i]();
	}
	return 0;
};

結果:

1
2
3
4
5
1
2
3
4
5

という結果でしたとさ。
結論としては、
・コード中にラムダ式1個書くと、無名クラスが1個作られる。
・同じ内容でも、どこに書いてあっても、ラムダ式を書く毎に1個無名クラス作られる。
で、良いみたい。
やっと挙動を理解できた……。