考虑下面的三个函数,
func1(std::function<size_t(...) > f, ...);
func2(std::function<size_t(...) >& f );
func3(const std::function<size_t(...)> &f);
对于通过值/复制构造函数传递的任何其他类型的参数,通过引用传递和通过 const 引用传递具有清晰的上下文,它们的用例是众所周知的。
对于function<>
对象的情况,例如通过 const 引用传递会节省时间(例如调用潜在的复制构造函数)还是空间(无需将整个函数对象传递给堆栈)?函数对象首先有多大才能使其值得通过常量引用传递?我的猜测是它大约是一个指针的大小 - 这是正确的吗?
让我们使用 gcc 4.9 并检查:
cout << sizeof(int(*)(double, double)) << endl;
cout << sizeof(function<int(double, double)>) << endl;
输出:
8
32
当然,可调用对象的大小大于指针大小,通过 const 引用传递它可能会受益。但是,这是一个好主意,前提是您可以保证通过 const 引用传递的对象(无论它是否开始std::function<>
)只要您打算使用它就存在。
对于
function<>
对象的情况,例如通过 const 引用传递会节省时间(例如调用潜在的复制构造函数)或空间(无需将整个函数对象传递给堆栈)吗?
或。你必须衡量它。
函数对象首先有多大才能使其值得通过常量引用传递?
这取决于实现。你必须衡量它。
我的猜测是它大约是一个指针的大小 - 这是正确的吗?
鼓励实现使用"小对象优化",以便将小函数对象存储在function
对象中,而不是动态分配。在这种情况下,它将是该对象的大小(或略大于)。否则,它将是指向动态对象的指针的大小(或略大于)。