将 lambda 存储到 std::function 中可能会造成存储浪费
Possible storage waste of storing lambda into std::function
具有空捕获列表的 lambda 表达式对象的大小为 1
但是如果你把它存储到std:function
,它的大小就变成了48(在我的平台上)
想象一下,当您拥有一个存储数千个函数的容器时
存入std::function
内存占用将增加48倍
即使是捕获小对象(如 8 大小的指针)的 lambda 对象也比 std::function
小得多
您有什么更好的主意来节省不必要的 space-usage 吗?
这是您为不需要知道函数类型而付出的代价。所有 std::function<void()>
都可以互换,无论它们来自哪个 lambda。如果你想在一个向量中存储许多相同类型的函数(具有不同的捕获),你可以使它成为一个函子而不是一个 lambda(这样它就有一个名字)并制作一个向量 of that输入.
示例:使用 lambda:
std::vector<std::function<void()>> funcs;
for(int i = 0; i < 10000; i++)
funcs.push_back([i]() {std::cout << i << std::endl;});
for(auto& func : funcs)
func();
带有仿函数:
struct number_printing_function {
int i;
number_printing_function(int i) : i(i) {}
void operator()() {
std::cout << i << std::endl;
}
};
std::vector<number_printing_function> funcs;
for(int i = 0; i < 10000; i++)
funcs.push_back(number_printing_function(i));
// or funcs.emplace_back(i);
for(auto& func : funcs)
func();
IMO 这有点没用,因为我们不妨存储一个整数向量,不要再假装它们是函数了。当你有许多相同类型的仿函数时,你已经知道它们的作用,所以就去做吧。真的,上面的代码只是下面的代码,但是有额外的步骤:
std::vector<int> ints;
for(int i = 0; i < 10000; i++)
ints.push_back(i);
for(auto& i : ints)
std::cout << i << std::endl;
具有空捕获列表的 lambda 表达式对象的大小为 1
但是如果你把它存储到std:function
,它的大小就变成了48(在我的平台上)
想象一下,当您拥有一个存储数千个函数的容器时
存入std::function
即使是捕获小对象(如 8 大小的指针)的 lambda 对象也比 std::function
您有什么更好的主意来节省不必要的 space-usage 吗?
这是您为不需要知道函数类型而付出的代价。所有 std::function<void()>
都可以互换,无论它们来自哪个 lambda。如果你想在一个向量中存储许多相同类型的函数(具有不同的捕获),你可以使它成为一个函子而不是一个 lambda(这样它就有一个名字)并制作一个向量 of that输入.
示例:使用 lambda:
std::vector<std::function<void()>> funcs;
for(int i = 0; i < 10000; i++)
funcs.push_back([i]() {std::cout << i << std::endl;});
for(auto& func : funcs)
func();
带有仿函数:
struct number_printing_function {
int i;
number_printing_function(int i) : i(i) {}
void operator()() {
std::cout << i << std::endl;
}
};
std::vector<number_printing_function> funcs;
for(int i = 0; i < 10000; i++)
funcs.push_back(number_printing_function(i));
// or funcs.emplace_back(i);
for(auto& func : funcs)
func();
IMO 这有点没用,因为我们不妨存储一个整数向量,不要再假装它们是函数了。当你有许多相同类型的仿函数时,你已经知道它们的作用,所以就去做吧。真的,上面的代码只是下面的代码,但是有额外的步骤:
std::vector<int> ints;
for(int i = 0; i < 10000; i++)
ints.push_back(i);
for(auto& i : ints)
std::cout << i << std::endl;