提高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;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...
不幸的是,您要做的事情不起作用,因为显式和隐式实例化工作之间存在一些差异:
隐式实例
如果您隐式实例化模板(就像使用状态计算机时通常会一样(,则编译器不一定会为所有成员函数生成代码:
类模板专业化的隐式实例
- 声明的隐式实例化,而不是定义的,非删除类成员函数,成员类,范围的成员枚举,静态数据成员,成员模板和朋友
C 标准草稿,[temp.inst/2]
显式实例
明确实例化模板(如上所述(时,编译器将视为明确实例化的每个成员函数,这意味着它也将尝试编译这些。
命名类模板专业化的明确实例化也是其每个成员的相同类型(声明或定义(的明确实例化(不包括从基本类中继承的成员和模板成员的成员( [。..]
C 标准草稿,[temp.explitic/10]
使用MSM
在这种特殊情况下,差异在于get_deferred_queue
成员函数。仅当deferred_msg_queue_helper
提供特定成员时,它才会汇编,仅当您的州支持延期事件时,这种情况才是这种情况。通常,您不调用该功能,因此编译器永远不会尝试实例化然后对其进行编译。但是,显式实例化使编译器尝试 - 失败 - 在状态机中编译get_deferred_queue
。显然,这是所需的标准行为,因此您唯一的解决方法是支持您的状态机中的递延事件,如文档中所述
不幸的是,您很有可能会遇到其他功能,这些功能通常在编译时会关闭。我遇到的下一个问题涉及visit_current_states
函数 - 为了解决此问题,我必须添加具有访问者功能的自定义基本状态,如下所述。将其编译而没有错误,尽管我不确定这些变化实际上会有什么影响。
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 提高MSM汇编速度
- 运行时速度汇编与 Arduino 上的 C/C++ 的差异
- 如何将处理器速度的汇编代码移植到Visual Studio 2008