我有一个 std::functions vector
Using Functors = std::vector<std::function<bool(int)>>;
Functors fs;
现在,如果我想向 vector 添加一个函数,我会这样做:
fs.emplace_back(
[](int v)->bool { return v > 1; }
)
我想知道当我声明“Functors”时,我是否应该使它指向 std::function 而不是原始的 std::function?相反,我将这样声明:
Using Functors = std::vector<
std::function<bool(int)>*
>; // note the last &
因此,当我调用 emplace_back 时,我将只传递一个指针而不是复制?或者 lambda 闭包是可移动的?请在这里说明一些问题:我什么时候应该使用对 std::function 的引用?
最佳答案
只需使用 std::vector<std::function<bool(int)>>
.
std::function
搬家时几乎总是很便宜。
为了不便宜,存储的函数对象必须 (A) 很小,(B) 有一个 no-except 移动构造函数,并且 (C) 移动起来很昂贵。
有意编写这样的对象并不难,但无意中就很难。
现在,标准没有强制要求多小;对于 MSVC,他们将其设置为一或两个 std::string
的大小以 s 为例。
几乎可以肯定,与在此处使用值相比,管理原始指针的开销会使您的代码更糟且性能更低。一方面是因为修复原始指针错误会耗费脑力资源,另一方面是因为在免费存储上分配对象比 std::function
更昂贵。当它移动几乎任何类型的数量级时都会发生。
平均而言,std::vector
中的元素如果用 push_back
从空填充 vector ,将移动固定次数(通常为 1-3)由于要求管理的内存呈指数增长,并且对象仅在需要调整大小时才移动。
拥抱值语义。
关于c++ - 什么时候应该存储函数的引用或指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408219/