我正在研究C ++ 11中的小型数学优化框架,我想知道用户提供特定于域的逻辑的最佳方式是什么。我可以强迫她使用可以被框架调用的钩子方法来定义类,但是我想保持它的精益,并且尽可能地利用新的C ++ 11工具。所以我正在考虑接受可能从lambda表达式实例化的std::function
个对象作为参数,并在需要时调用它们。我唯一想到的是编译器(在我的情况下是gcc,但我想知道Xcode和Visual C ++)是否能够获取std :: function对象并内联函数定义,以便它们与其余代码一起进行优化。
答案 0 :(得分:8)
std::function
是一个可调用对象,可以存储任何可调用对象。它的设计尽可能灵活。然而,这种设计有缺点。因为function
s几乎可以包含任何内容(可调用),所以它们必须能够使用任何。
在内部,function
在编译时不知道它可能存储的内容。由于这个确定是一个运行时,大多数普通编译器几乎不可能内联。通过函数指针进行内联是可能的,但前提是它本地知道该指针的值是什么。 function
比单纯的函数指针复杂得多。
理论上可以内联这样的事情,但仅作为某种配置文件引导优化系统的一部分,其中代码的重复执行能够确定某些function
对象将始终与某些内容,从而内联它们。但即使这样也是
如果要为任意可调用对象进行内联,则应使用模板函数,而不是std::function
。 function
适用于无法使用模板的情况(可能是因为您需要在容器中存储多个函数,或者因为您不想破坏封装,或者其他),仍然需要存储任意的callables。