直接插入状态图代码

关于此任务

请考虑以下状态图:

状态图

使用平面方案实现此状态图时,您期望将下列方法添加到类中,并通过从 rootState_dispatchEvent() 中进行一系列函数调用来调用这些方法:

int MyClass::s2TakeNull() {
    int res = eventNotConsumed;
    s2_exit();
    //#[ transition 2
    f2();
    f2();
    //#]
    s3_entDef();
    res = eventConsumed;
    return res;
};
int MyClass::s1TakeNull() {
    int res = eventNotConsumed;
    s1_exit();
    //#[ transition 1
    f1();
    f1();
    //#]
    s2_entDef();
    res = eventConsumed;
    return res;
};

发生的情况实际是,方括号 //#[//#] 之间的过渡代码立即直接插入(嵌入)到 rootState_dispatchEvent() 中,如下所示:

int MyClass::rootState_dispatchEvent(short id) {
    int res = eventNotConsumed;
    switch(rootState_active) {
        case s1:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 1
                    f1();
                    f1();
                    //#]
                    pushNullConfig();
                    rootState_subState = s2;
                    rootState_active = s2;
                    res = eventConsumed;
                }
            break;
        };
        case s2:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 2
                    f2();
                    f2();
                    //#]
                    rootState_subState = s3;
                    rootState_active = s3;
                    res = eventConsumed;
                }
            break;
        };
    };
    return res;
}; 

因为此代码通过直接插入代码减少了一些函数调用,因此更为高效。直接插入功能是通过类的 CG::Class::ComplexityForInlining 属性提供的,在缺省情况下,此属性设置为 3。这意味着,如果用户代码(过渡的动作部分)不足 3 行,那么它将直接插入(即嵌入)到函数调用位置,而不是进行函数调用。要获取“期望的”结果(而不进行直接插入),请将此属性设置为 0


反馈