c++ - 什么时候应该存储函数的引用或指针?

标签 c++ c++11 std-function

我有一个 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/

相关文章:

c++11 - 带有 std::function 参数的函数不接受 lambda 函数

c++ - std::function 类型和模板实例化

c++ - 为线程创建模板

c++ - 我可以在一行上写一个带有变量声明的 if 语句吗?

c++ - openCV 2.4.3 iOS 框架编译器无法识别某些 C++ header

c++ - 如何在静态析构函数中安全地使用 `std::error_category`?

c++ - 理解静态 constexpr 成员变量

c++ - 估计 C++11 中剩余的时间

c++ - PHP 的 is_dir() 的 C++ 等价物是什么?

c++ - 焦炭中的垃圾