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

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

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

PS:从评论来看,我的问题的第一次修改对大多数用户来说似乎是晦涩难懂的,这可能是我使用了不正确的语言的错。所以我改写了它,我希望有人能理解我在这里试图传达的概念(并可能提出解决方案)。

PPS:有人建议使用模板,这是我考虑过的想法,但我想知道是否有其他选择。我对模板没有任何反对意见,但我计划在这个版本开始工作后立即制作一个基于模板的版本,因为我发现根据动态对象进行推理更容易。

最佳答案

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

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

理论上可以内联这样的东西,但只能作为某种配置文件引导的优化系统的一部分,重复执行代码能够确定某些 function 对象将始终与某些内容一起使用,从而内联它们。但即便如此

如果您想内联任意可调用对象,您应该使用模板函数,而不是 std::functionfunction 适用于当您不能使用模板时(可能是因为您需要在容器中存储多个函数,或者因为您不想破坏封装,或者其他原因) ), 但仍然需要存储任意可调用对象。

关于c++ - std::functions 是否由 C++11 编译器内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16729941/

相关文章:

c++ - 基类初始化器和成员变量初始化器的顺序重要吗?

C++、OLE、Excel 自动化 : EAccessviolation at 00000800

c++ - 计算插入排序和归并排序的效率(daa)

c++ - 在 mac osx 中反汇编 g++ 创建的可执行文件

c++ - 下载 Borland BCC

c++ - 在 C++ 中调用 struct 的构造函数时出现 undefined reference 链接错误

c++ - 以方便的方式在 C++ 中使用方法作为回调

c++ - 我在哪里可以了解编译器和断言优化?

python - Python 的 AoT 编译器

c++ - 一元和二元否定