提高MSM编译速度

时间:2018-04-25 07:38:02

标签: c++ boost boost-msm

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

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

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

if ($_GET){
add_rewrite_rule(
        "^$slug/(.+)$",
        'index.php?post_type=xxx',
        'top'
    );
}

1 个答案:

答案 0 :(得分:2)

由于some differences between how explicit and implicit instantiation work,您尝试做的事情不幸无效:

隐式实例化

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

  

类模板特化的隐式实例化导致

     
      
  • 未删除的类成员函数,成员类,作用域成员枚举,静态数据成员,成员模板和朋友的声明的隐式实例化,但不是定义的隐式实例化
  •   

C++ standard draft, [temp.inst/2]

显式实例化

当您显式实例化模板时(如上所述),编译器会将每个成员函数视为显式实例化,这意味着它也会尝试编译它们。

  

用于命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和作为模板的成员)的相同类型(声明或定义)的显式实例化 [。 ..]

C++ standard draft, [temp.explicit/10]

使用MSM

在这种特殊情况下,区别在于get_deferred_queue成员函数。它只会在deferred_msg_queue_helper提供特定成员时进行编译,只有当您的州支持延期事件时才会这样。通常,您不会调用该函数,因此编译器永远不会尝试实例化然后编译它。但是,显式实例化使编译器尝试 - 并且失败 - 在状态机中编译get_deferred_queue。显然,this is desired standard behavior,所以唯一的解决方法是支持状态机中的延迟事件,如in the documentation所述

不幸的是,您很可能会遇到通常在编译时关闭的其他功能的其他问题。我遇到的下一个问题涉及visit_current_states函数 - 为了解决这个问题,我必须添加一个自定义基本状态,其中包含here所述的访问者功能。 使编译没有错误,虽然我不完全确定这些更改实际上有什么影响。