考虑C程序中的以下情况。我们有一组函数,让泛型函数为
void needs_param (void * param, ...);
,这取决于某些参数的值param。参数param由函数计算,例如
void compute_param (..., void * param);
我们希望param尽可能地向调用者隐藏(类型、大小、值...)的详细信息,其中调用者是一个使用函数compute_param和needs_param. 如果您可以自由修改needs_param和,如何最有效和线程安全地实现这一点compute_param?
我考虑并排除了以下可能性:
答:因为我们可以自由修改needs_param,所以一种方法是传递gen_param及其参数而不是param,并让needs_param计算param自行计算。但是param计算起来很昂贵,并且需要多次作为其他函数的参数。
b:我们可以实现compute_param为
void * compute_param (...) {
static param_type param = ...
return ¶m;
}
但是,这不是线程安全的,使用openmp我们必须保护调用
#pragama omp critical
{
void * param = compute_param (...)
}
这将严重影响线程程序的性能。
C:一种解决方案是使用 malloc/free
void compute_param (..., void * param) {
param = malloc (sizeof (param_type));
....
*param = ...
}
这给调用者带来了释放分配的内存的负担,同时由于昂贵的堆内存而效率低下。
d:的使用alloca,例如
void * param = alloca (param_size);
compute_param (..., param);
...
needs_param (param, ...);
,需要有关param调用者空间中大小的信息,我们希望将其隐藏。
你有什么建议吗?