小编gro*_*ndi的帖子

使用内部静态变量来提高性能?

我有一个函数需要相当多的内部临时存储来进行计算(一些矩阵运算),我知道这个函数会被频繁调用(比如整个程序运行时的每毫秒).我的直觉告诉我,最好将这些临时变量声明为静态,因此每次调用函数时都不会再次创建它们.每次调用函数时我都必须初始化它们,因此功能目的不需要保持它们存活.我知道让它们静态会破坏线程安全性,但这不是问题.

由于知识通常比任何直觉都好,我想知道处理这种情况的"正确"方法是什么.

void frequentlyCalledFunction(void)
{
    double matrix1[10][10];
    double matrix2[10][10];
    /* do something with the matrices ... */
}
Run Code Online (Sandbox Code Playgroud)

要么

void frequentlyCalledFunction(void)
{
    static double matrix1[10][10];
    static double matrix2[10][10];
    /* do something with the matrices ... */
}
Run Code Online (Sandbox Code Playgroud)

c

8
推荐指数
3
解决办法
2076
查看次数

大型与嵌套式国家机器

我在具有极少(3)个状态的实时系统中有一个状态机.

typedef enum {
    STATE1,
    STATE2,
    STATE3
} state_t;
Run Code Online (Sandbox Code Playgroud)

但是,这些状态之间的转换需要相当长的时间并且有自己的细分.所以我有两个选择,要么扩展主状态机,以便表示所有中间状态:

typedef enum {
    STATE1,
    STATE1_PREPARE_TRANSITION_TO_STATE2,
    STATE1_DO_TRANSITION_TO_STATE2,
    STATE1_PREPARE_TRANSITION_TO_STATE3,
    STATE1_DO_TRANSITION_TO_STATE3,
    STATE2,
    ...
} state_t;
Run Code Online (Sandbox Code Playgroud)

或者我为相关的主要状态创建一个嵌套的状态机:

typedef enum {
    STATE1_NOT_ACTIVE,
    STATE1_NORMAL,
    STATE1_PREPARE_TRANSITION_TO_STATE2,
    STATE1_DO_TRANSITION_TO_STATE2,
    STATE1_PREPARE_TRANSITION_TO_STATE3,
    STATE1_DO_TRANSITION_TO_STATE3
} sub_state1_t;
...
Run Code Online (Sandbox Code Playgroud)

两种可能性都有其优点和缺点.大型的状态机很容易变得混乱和复杂.但是,在第二种情况下使所有状态保持一致并不是微不足道的,并且许多函数需要有关全局状态和子状态的信息.

我想避免复杂的代码,它必须处理几个并行状态,如:

if ((global_state == STATE1) &&
    (sub_state_1 == STATE1_DO_TRANSITION_TO_STATE2))
{
    ...
    if (transition_xy_done(...))
    {
        global_state = STATE2;
        sub_state_1 = STATE1_NOT_ACTIVE;
        sub_state_2 = STATE2_NORMAL;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个问题的一般最佳方法是什么:许多小型和嵌套的状态机(有许多无效组合),一个大型状态机或其他任何东西?

c state-machine

3
推荐指数
2
解决办法
1646
查看次数

标签 统计

c ×2

state-machine ×1