【发布时间】:2015-04-29 16:34:15
【问题描述】:
考虑以下三个函数,
func1(std::function<size_t(...) > f, ...);
func2(std::function<size_t(...) >& f );
func3(const std::function<size_t(...)> &f);
对于通过值/复制构造函数传递的任何其他类型的参数,通过引用传递和通过 const 引用传递具有明确的上下文,并且它们的用例是众所周知的。
对于function<> 对象,例如通过 const 引用节省时间(例如调用潜在的复制构造函数)或空间(无需将整个函数对象传递到堆栈)?首先,函数对象有多大才值得通过 const 引用传递?我的猜测是它大概是指针的大小 - 这是正确的吗?
【问题讨论】:
-
我一直觉得
std::function实际上是相当重量级的。例如,它必须能够包含成员函数指针的类实例。它可能会使用捕获的变量包装绑定表达式或 lambda,这显然需要存储需要复制的额外状态(除非它是堆分配的,我想)。 -
否:复制一个函数对象(例如,持有一个 lambda)可能非常昂贵。
-
@Cameron:这取决于它包装了什么类型的函数对象,以及它是如何实现的。如果它包装了一个小的(甚至是空的)对象,并且优化为不动态分配它,那么它可以非常轻量级。