19

假设我有一个二进制搜索函数,它初始化并使用 lambda:

bool custom_binary_search(std::vector<int> const& search_me)
{
  auto comp = [](int const a, int const b)
    {
      return a < b;
    };

  return std::binary_search(search_me.begin(), search_me.end(), comp);
}

没有指出这完全是多余的,只关注 lambda;每次都声明和定义该 lambda 对象是否昂贵?它应该是静态的吗?lambda 是静态的意味着什么?

4

2 回答 2

12

类型为<some anonymous lambda class> 的变量'comp' 可以设为静态,几乎与任何其他局部变量一样,即每次运行此函数时,它都是同一个变量,指向同一个内存地址)。

但是,请注意使用闭包,这将导致细微的错误(按值传递)或运行时错误(按引用传递),因为闭包对象也只初始化一次:

bool const custom_binary_search(std::vector<int> const& search_me, int search_value, int max)
{
  static auto comp_only_initialized_the_first_time = [max](int const a, int const b)
  {
      return a < b && b < max;
  };

  auto max2 = max;
  static auto comp_error_after_first_time = [&max2](int const a, int const b)
  {
      return a < b && b < max2;
  };

  bool incorrectAfterFirstCall = std::binary_search(std::begin(search_me), std::end(search_me), search_value, comp_only_initialized_the_first_time);
  bool errorAfterFirstCall = std::binary_search(std::begin(search_me), std::end(search_me), search_value, comp_error_after_first_time);

  return false; // does it really matter at this point ?
}

请注意,“max”参数只是用来引入您可能希望在比较器中捕获的变量,而“custom_binary_search”实现的功能可能不是很有用。

于 2013-10-15T10:32:36.350 回答
1

以下代码在 Visual Studio 2013 中编译并运行正常:

bool const test(int & value)
{
    //edit `&value` into `&` @log0
    static auto comp = [&](int const a, int const b)
    {
        return a < (b + value);
    };

    return comp(2,1);
}

然后:

int q = 1;
cout << test(q); // prints 0 //OK
q++;
cout << test(q); // prints 1 //OK

编译器会将任何 lambda 声明转换为常规函数,这是在编译时完成的。函数中的实际定义test只是comp使用指向 ac 函数的指针对变量进行常规赋值。闭包通常是相同的,但只有在它们定义的范围内才能正常工作。在任何其他范围内,它们都会失败或产生内存损坏错误。

定义comp静态只会微不足道或根本不会提高性能。

希望这会有所帮助:Razvan。

于 2013-10-15T11:07:46.663 回答