提高MSM汇编速度

Boost MSM compilation speedup

本文关键字:速度 汇编 MSM 提高      更新时间:2023-10-16

我正在尝试通过使用Boost MSM状态机的显式模板实例化来减少项目的编译时间。但是,每当我添加显式模板实例化时,我的项目都不会编译。

您可以使用文档中的示例在此处找到问题的示例:http://coliru.stacked-crooked.com/a/9850cae23afdada2。(这是一个人为的示例,因为只有一个翻译单元,但错误与我在项目中使用显式模板实例化时相同。(

有人知道如何解决这些编译错误吗?

/usr/local/include/boost/msm/back/state_machine.hpp: In instantiation of 'boost::msm::back::state_machine<A0, A1, A2, A3, A4>::deferred_events_queue_t& boost::msm::back::state_machine<A0, A1, A2, A3, A4>::get_deferred_queue() [with A0 = player_; A1 = boost::parameter::void_; A2 = boost::parameter::void_; A3 = boost::parameter::void_; A4 = boost::parameter::void_; boost::msm::back::state_machine<A0, A1, A2, A3, A4>::deferred_events_queue_t = std::deque<std::pair<boost::function<boost::msm::back::HandledEnum()>, bool>, std::allocator<std::pair<boost::function<boost::msm::back::HandledEnum()>, bool> > >]':
main.cpp:271:27:   required from here
/usr/local/include/boost/msm/back/state_machine.hpp:1346:40: error: 'struct boost::msm::back::state_machine<player_>::deferred_msg_queue_helper<boost::msm::back::state_machine<player_>, int>' has no member named 'm_deferred_events_queue'
         return m_deferred_events_queue.m_deferred_events_queue;
                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...

不幸的是,您要做的事情不起作用,因为显式和隐式实例化工作之间存在一些差异:

隐式实例

如果您隐式实例化模板(就像使用状态计算机时通常会一样(,则编译器不一定会为所有成员函数生成代码:

类模板专业化的隐式实例

  • 声明的隐式实例化,而不是定义的,非删除类成员函数,成员类,范围的成员枚举,静态数据成员,成员模板和朋友

C 标准草稿,[temp.inst/2]

显式实例

明确实例化模板(如上所述(时,编译器将视为明确实例化的每个成员函数,这意味着它也将尝试编译这些。

命名类模板专业化的明确实例化也是其每个成员的相同类型(声明或定义(的明确实例化(不包括从基本类中继承的成员和模板成员的成员( [。..]

C 标准草稿,[temp.explitic/10]

使用MSM

在这种特殊情况下,差异在于get_deferred_queue成员函数。仅当deferred_msg_queue_helper提供特定成员时,它才会汇编,仅当您的州支持延期事件时,这种情况才是这种情况。通常,您不调用该功能,因此编译器永远不会尝试实例化然后对其进行编译。但是,显式实例化使编译器尝试 - 失败 - 在状态机中编译get_deferred_queue。显然,这是所需的标准行为,因此您唯一的解决方法是支持您的状态机中的递延事件,如文档中所述

不幸的是,您很有可能会遇到其他功能,这些功能通常在编译时会关闭。我遇到的下一个问题涉及visit_current_states函数 - 为了解决此问题,我必须添加具有访问者功能的自定义基本状态,如下所述。将其编译而没有错误,尽管我不确定这些变化实际上会有什么影响。