質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1350閲覧

c++ ラムダ式のローカル関数の宣言は、毎フレームしてよいか

clateratail

総合スコア24

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/01 13:31

ローカル変数は、スコープに来るたびにメモリを確保、スコープ抜けで解放していると思いますが
ラムダ式のローカル関数の実体も同じなのでしょうか?

void loop(){//毎フレーム呼ばれる auto xxxx = [&a](int b) { 長い記述 }; }

ローカル関数の中身の記述が長く複雑な場合など、毎フレームその宣言を呼ぶと処理が重くなったりしますか?
それとも静的変数やグローバルな関数のように、ローカル関数も実体のメモリ確保は一度きりですか?
キャプチャの有り無しでも違いますか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

重いの定義に依りますが、心配するレベルではないと思います。

ざっくりとどういう風に書き換えられるかというとこんな感じです。

void loop(){ int a = 0; auto xxx =[&a](int b){a += b; return a;} std::cout << xxx(10) << std::endl; } //この書式の展開方法 int func(int &a, int b){a += b; return a;} struct sfunc{ int &a; int (*pfunc)(int &, int); } void loop(){ int a = 0; sfunc xxx = sfunc(&a, &func); std::cout << xxx.func(xxx.a, 10) << std::endl; }

なので、関数ポインタとキャプチャを諸々を含んだ構造体を作り、
それをうまい感じに関数呼び出しに変える、って感じです。

やっていることは構造体作成のコストだけなので、
リアルタイムにインタプリタみたいな作業が発生しているわけではありません。

投稿2019/09/01 14:07

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

clateratail

2019/09/01 15:01

おお、なるほど、非常によく分かりました 具体例まで記述していただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問