考虑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
调用者空间中大小的信息,我们希望将其隐藏。
你有什么建议吗?