std::function vs std::function& 作为函数参数



考虑下面的三个函数,

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对象中,而不是动态分配。在这种情况下,它将是该对象的大小(或略大于)。否则,它将是指向动态对象的指针的大小(或略大于)。

相关内容

最新更新