プログラムとかデジタル系趣味とか

C++のラムダとラムダ式変数のサイズ

C++ラムダ式に[&]や[=]を使うなと言う話…を人に説明
理由がちょっと間違ってた話

ラムダ式は、[=]か[&]としてしまえば、キャプチャ対象を気にせず使えてやりがちです。
しかし、一度その危険性に気づけば二度とやらないでしょう。
何を使ってるのか明確じゃないのが何より怖い。

そもそもキャプチャされる量が制限されないからスタックの無駄だ!!
という事を、言ったり思ったりしていたのですが。
本当にそうかと思いテストしました。
結果から言うと、ちゃんと自己管理できてたら[=]でいいかな。
チームでやってるときは気づかずキャプチャするかもしれないから私は推奨しませんが。


それよりも一つ勉強になったのは、以下のことです。
・キャプチャを明示的に書くとその順にキャプチャされる
・キャプチャされた値は、構造体のように自動パディングが入る。

つまり、1,2,4,8,以後8の倍数で増えていく。

あと厄介なのが
[char,int,char]と[int,char,char]これは前者のほうがサイズが小さくなるということ。

[=]を使ったとき、恐らく登場順に入ること。

int i1;
char c1;c2;
auto func1=[=](){return c1+c2+i1;};
auto func2=[=](){return c1+i1+c2;};

上記だとfunc2が8バイトに対し、func1は4バイトになります。

そうなると明示的に書いたほうがいいかなって思いました。

以上

テストコードは以下です。
github.com