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

tun*_*nuz 5 c++ compiler-construction lambda compiler-optimization c++11

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

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

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

Nic*_*las 8

std::function是一个可调用的对象,可以存储任何可调用的对象.它的设计尽可能灵活.然而,这种设计有缺点.因为functions几乎可以包含任何东西(可调用),所以它们必须能够处理任何事情.

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

理论上可以内联这样的事情,但仅作为某种轮廓引导优化系统的一部分,其中代码的重复执行能够确定某些function对象将始终与某些内容一起使用并因此内联它们.但即便如此

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