我正在生成在嵌入系统上运行的C代码,而我想要生成的代码包含对具有大量参数的函数的调用。当我生成函数时,这些参数的数量总是已知的,并且它们总是由许多输入和输出数组组成。
在我当前的代码版本中,我生成的C代码包含以下形式的函数:
void f(const double* x0, const double* x1, const double* x2, double* r0, double* r1);
在这种情况下,我有3个输入数组和2个输出数组。然而,通常,输入和输出阵列的数量可以非常大,如数百或数千。请注意,该代码不应由人类阅读。
现在,我已经了解了C标准only guarantees support for up to 127 function parameters。此外,我还希望生成的代码符合嵌入式系统的严格编码标准,我发现Jet Propulsion Laboratory's coding standard for C-code只允许最多6个参数。
那么,如何以最有效的方式用最多6个函数参数重写上面的代码?请注意,我只对执行速度感兴趣,而不是代码可读性。
我的第一个想法是按如下方式处理上述功能:
void f(const double* x[], double* r[]);
然后调用此代码如下(线程安全不是问题):
static const double* x[] = {x0, x1, x2};
static double* r[] = {r0, r1};
f(x,r);
这是个好主意吗?还有其他更有效的替代方案吗?
答案 0 :(得分:2)
比你的解决方案稍微高效一点就是能够通过一个指针访问所有参数,你可以用一个结构来处理它,它也可以处理不同类型的参数:
typedef struct
{
const double* in[3];
double* out[2];
} MyFuncArgs;
MyFuncArgs myFuncArgs = { { x0, x1, x2 }, { r0, r1 } };
void myFunc(MyFuncArgs*);
myFunc(&myFuncArgs);
...
void myFunc(MyFuncArgs* args)
{
// do stuff with args->in[...], put results in args->out[...].
}
可替换地:
typedef struct
{
const double *in0, *in1, *in2;
double *out0, *out1;
} MyFuncArgs;
MyFuncArgs myFuncArgs = { x0, x1, x2, r0, r1 };
void myFunc(MyFuncArgs*);
myFunc(&myFuncArgs);
...
void myFunc(MyFuncArgs* args)
{
// do stuff with args->in0 ..., put results in args->out0 ...
}
答案 1 :(得分:0)
我认为你做得很好。数组符合您的要求