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的引用?
只是用std::vector<std::function<bool(int)>>.
std::function 移动时几乎总是便宜.
为了使它不便宜,存储的函数对象必须(A)小,(B)具有无除外移动构造函数并且(C)移动昂贵.
有目的地写这样的对象并不难,但很难不小心写一个.
现在,标准没有规定多小; 例如,对于MSVC,他们将其设置为一个或两个std::strings 的大小.
几乎可以肯定,管理原始指针的开销会使你的代码比使用这里的值更差,性能更差.两者都是因为你将燃烧心理资源来修复原始指针错误,并且因为在免费商店中分配对象比std::function在几乎任何类型移动几个数量级时更昂贵.
平均而言,std::vector如果从空中填充向量,则会将元素中的元素移动常数次数(通常为1-3),push_back因为内存管理的命令会成倍增长,并且只有在需要调整大小时才会移动对象.
拥抱价值语义.