将 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;