2

私はバインドで遊んでいて、考えていました.ラムダは関数ポインタと同じくらい高価ですか?

つまり、ラムダを理解しているように、それらはファンクターの構文糖衣であり、バインドは似ています。ただし、これを行う場合:

#include<functional>
#include<iostream>

void fn2(int a, int b)
{
  std::cout << a << ", " << b << std::endl;
}

void fn1(int a, int b)
{
  //auto bound = std::bind(fn2, a, b);
  //static auto bound = std::bind(fn2, a, b);
  //auto bound = [&]{ fn2(a, b); };
  static auto bound = [&]{ fn2(a, b); };
  bound();
}

int main()
{
  fn1(3, 4);
  fn1(1, 2);
  return 0;
}

ここで、 1st を使用すると、次auto bound = std::bind(fn2, a, b);の出力が得られます

3、4

1、2

、私が得る2番目
3、4

3、4

. 3番目と4番目は、1番目と同じように出力されます。

これで、1 番目と 2 番目がそのように機能する理由がわかりました。関数呼び出しの開始時に初期化されます (静的なもので、最初に呼び出されたときのみ)。ただし、3 と 4 では、生成されたファンクターが囲んでいるスコープの変数への参照を実際に作成するのではなく、最初だけまたは毎回初期化されるかどうかに関係なく、実際にシンボルにラッチしているコンパイラ マジックが進行しているようです。

誰かがここで実際に何が起こっているのかを明確にすることができますか?

編集:私が欠けstatic auto bound = std::bind(fn2, std::ref(a), std::ref(b));ていたのは、4番目のオプションとして機能させるために使用していました。

4

2 に答える 2