Boost MSM编译加速
Boost MSM compilation speedup
我试图通过使用 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;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...
不幸的是,由于:
,您正在尝试做的事情没有奏效
隐式实例化
如果您隐式实例化一个模板(就像您通常在使用状态机时所做的那样),编译器不一定会为所有成员函数生成代码:
The implicit instantiation of a class template specialization causes
- the implicit instantiation of the declarations, but not of the definitions, of the non-deleted class member functions, member classes, scoped member enumerations, static data members, member templates, and friend
C++ standard draft, [temp.inst/2]
显式实例化
当您显式实例化一个模板时(正如您在上面尝试的那样),编译器会将 each 成员函数视为显式实例化,这意味着它也会尝试编译它们.
An explicit instantiation that names a class template specialization is also an explicit instantiation of the same kind (declaration or definition) of each of its members (not including members inherited from base classes and members that are templates) [...]
C++ standard draft, [temp.explicit/10]
有 MSM
在这种特殊情况下,区别在于 get_deferred_queue
成员函数。它只会在 deferred_msg_queue_helper
提供特定成员时编译,只有当您的状态支持延迟事件时才会出现这种情况。通常,您不会调用该函数,因此编译器永远不会尝试实例化然后编译它。但是,显式实例化使编译器尝试在您的状态机中编译 get_deferred_queue
并失败。显然,, so the only workaround for you is to support deferred events in your state machine as described in the documentation
不幸的是,您很可能 运行 遇到通常在编译时关闭的其他功能的其他问题。我遇到的下一个问题涉及 visit_current_states
函数——为了解决这个问题,我必须添加一个自定义基本状态,并具有访问者功能,如 here 所述。 那 使它编译时没有错误,尽管我不完全确定这些更改实际会产生什么影响。
我试图通过使用 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;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...
不幸的是,由于
隐式实例化
如果您隐式实例化一个模板(就像您通常在使用状态机时所做的那样),编译器不一定会为所有成员函数生成代码:
The implicit instantiation of a class template specialization causes
- the implicit instantiation of the declarations, but not of the definitions, of the non-deleted class member functions, member classes, scoped member enumerations, static data members, member templates, and friend
C++ standard draft, [temp.inst/2]
显式实例化
当您显式实例化一个模板时(正如您在上面尝试的那样),编译器会将 each 成员函数视为显式实例化,这意味着它也会尝试编译它们.
An explicit instantiation that names a class template specialization is also an explicit instantiation of the same kind (declaration or definition) of each of its members (not including members inherited from base classes and members that are templates) [...]
C++ standard draft, [temp.explicit/10]
有 MSM
在这种特殊情况下,区别在于 get_deferred_queue
成员函数。它只会在 deferred_msg_queue_helper
提供特定成员时编译,只有当您的状态支持延迟事件时才会出现这种情况。通常,您不会调用该函数,因此编译器永远不会尝试实例化然后编译它。但是,显式实例化使编译器尝试在您的状态机中编译 get_deferred_queue
并失败。显然,
不幸的是,您很可能 运行 遇到通常在编译时关闭的其他功能的其他问题。我遇到的下一个问题涉及 visit_current_states
函数——为了解决这个问题,我必须添加一个自定义基本状态,并具有访问者功能,如 here 所述。 那 使它编译时没有错误,尽管我不完全确定这些更改实际会产生什么影响。