假设我有一个初始化并使用lambda的二进制搜索函数:
bool const 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成为静态?
答案 0 :(得分:6)
变量'comp',类型为&lt; some anonymous lambda class&gt;可以变为静态,几乎与任何其他局部变量一样,即它是相同的变量,每次运行此函数时都指向相同的内存地址。)
但是,请注意使用闭包,这会导致细微的错误(按值传递)或运行时错误(按引用传递),因为闭包对象也只初始化一次:
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”实现的功能可能不是很有用。
答案 1 :(得分: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
变量的常规赋值,其指针指向c函数。
闭包通常是相同的,但只能在它们定义的范围内正常工作。在任何其他范围内,它们都会失败或产生内存损坏错误。
定义comp
静态只会微不足道地提高性能或根本不提高性能。
希望这会有所帮助: 勒兹。