是否由C ++ 11编译器内联std :: functions?

时间:2013-05-24 07:38:34

标签: c++ compiler-construction c++11 compiler-optimization lambda

我正在研究C ++ 11中的小型数学优化框架,我想知道用户提供特定于域的逻辑的最佳方式是什么。我可以强迫她使用可以被框架调用的钩子方法来定义类,但是我想保持它的精益,并且尽可能地利用新的C ++ 11工具。所以我正在考虑接受可能从lambda表达式实例化的std::function个对象作为参数,并在需要时调用它们。我唯一想到的是编译器(在我的情况下是gcc,但我想知道Xcode和Visual C ++)是否能够获取std :: function对象并内联函数定义,以便它们与其余代码一起进行优化。

PS:从评论中看,我的问题的第一个版本看起来对大多数用户来说都很模糊,可能是我使用错误语言的错误。所以我重写了它,我希望有人能够理解我在这里传达的概念(并且可能建议一个解决方案)。

PPS:有人建议使用模板,这是我想过的一个想法,但我想知道是否有其他选择。我没有任何反对模板的东西,但是我计划在这个版本工作时立即创建一个基于模板的版本,因为我发现在动态对象方面更容易推理。

1 个答案:

答案 0 :(得分:8)

std::function是一个可调用对象,可以存储任何可调用对象。它的设计尽可能灵活。然而,这种设计有缺点。因为function s几乎可以包含任何内容(可调用),所以它们必须能够使用任何

在内部,function在编译时不知道它可能存储的内容。由于这个确定是一个运行时,大多数普通编译器几乎不可能内联。通过函数指针进行内联是可能的,但前提是它本地知道该指针的值是什么。 function比单纯的函数指针复杂得多。

理论上可以内联这样的事情,但仅作为某种配置文件引导优化系统的一部分,其中代码的重复执行能够确定某些function对象将始终与某些内容,从而内联它们。但即使这样也是

如果要为任意可调用对象进行内联,则应使用模板函数,而不是std::functionfunction适用于无法使用模板的情况(可能是因为您需要在容器中存储多个函数,或者因为您不想破坏封装,或者其他),仍然需要存储任意的callables。