Lambda到std::函数的转换性能
Lambda to std::function conversion performance
我想使用lambda函数异步调用引用计数对象的方法:
void RunAsync(const std::function<void()>& f) { /* ... */ }
SmartPtr<T> objPtr = ...
RunAsync([objPtr] { objPtr->Method(); });
创建lambda表达式显然会创建一个副本,但我现在遇到的问题是,将lambda表达式转换为std::function
对象也会创建我的智能指针的一堆副本,每个副本都会增加引用计数。
#include <functional>
struct C {
C() {}
C(const C& c) { ++s_copies; }
void CallMe() const {}
static int s_copies;
};
int C::s_copies = 0;
void Apply(const std::function<void()>& fct) { fct(); }
int main() {
C c;
std::function<void()> f0 = [c] { c.CallMe(); };
Apply(f0);
// s_copies = 4
}
虽然之后引用的数量会恢复正常,但出于性能原因,我希望防止太多的引用操作。我不确定所有这些复制操作是从哪里来的。
是否有任何方法来实现这与我的智能指针对象的更少的副本?
更新:编译器是Visual Studio 2010.
std::function
可能不会像自定义函子那样快,除非编译器对简单的情况实现了一些严肃的特殊处理。
但当move
合适时,引用计数问题是复制的症状。正如其他人在评论中指出的那样,MSVC没有正确地实现move
。您所描述的用法只需要移动,而不需要复制,因此永远不应该改变引用计数。
如果可以的话,试着用GCC编译,看看问题是否消失了。
转换为std::function
应该只使移动的lambda。如果没有这样做,那么可以说std::function
的实现或规范中存在错误。此外,在上面的代码中,我只能看到原始c
的两个副本,一个用于创建lambda,另一个用于从中创建std::function
。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 隐式转换函数的返回对象时是否会影响性能?
- isspace 函数的性能警告,从 int 转换为布尔值
- 加快 R 性能或将 R 函数转换为C++函数
- 浮点转换和性能
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 枚举静态转换为布尔,编译器发出性能警告
- 可以安全地使用静态强制转换,为每个实例使用唯一的虚拟 int type() 来提高性能
- 将所有双精度转换为整数以获得更好的性能,这只是一个谣言
- 字符串到flywweights的字符串转换:更好的性能选项
- 将std::string转换为大写:主要性能差异
- Lambda到std::函数的转换性能
- 使用marshal_as函数转换字符串的性能
- 转换c++映射到C数组-性能
- 多态类、虚函数和性能强制转换