我应该何时存储函数的引用或指针?

Wha*_*rld 0 c++ c++11 std-function

我有一个std :: functions的向量

Using Functors = std::vector<std::function<bool(int)>>;
Functors fs;
Run Code Online (Sandbox Code Playgroud)

现在,如果我想向向量添加一个函数,我会:

fs.emplace_back(
    [](int v)->bool { return v > 1; }
)
Run Code Online (Sandbox Code Playgroud)

我想知道什么时候我声明"Functors",我应该指向std :: function而不是raw std :: function吗?这意味着,我会这样声明:

    Using Functors = std::vector<
     std::function<bool(int)>*
    >; // note the last &
Run Code Online (Sandbox Code Playgroud)

因此,当我调用emplace_back时,我只会传入指针而不是复制?或者lambda闭合可以移动?请在这里说明一下:我何时应该使用std :: function的引用?

Yak*_*ont 7

只是用std::vector<std::function<bool(int)>>.

std::function 移动时几乎总是便宜.

为了使它不便宜,存储的函数对象必须(A)小,(B)具有无除外移动构造函数并且(C)移动昂贵.

有目的地这样的对象并不难,但很难不小心写一个.

现在,标准没有规定多小; 例如,对于MSVC,他们将其设置为一个或两个std::strings 的大小.

几乎可以肯定,管理原始指针的开销会使你的代码比使用这里的值更差,性能更差.两者都是因为你将燃烧心理资源来修复原始指针错误,并且因为在免费商店中分配对象比std::function在几乎任何类型移动几个数量级时更昂贵.

平均而言,std::vector如果从空中填充向量,则会将元素中的元素移动常数次数(通常为1-3),push_back因为内存管理的命令会成倍增长,并且只有在需要调整大小时才会移动对象.

拥抱价值语义.

  • 总而言之,Yakk的建议是使用`std :: vector <std :: function <bool(int)>>`. (2认同)