Cプログラムで次の状況を考えてみましょう。関数のセットがあります。一般的なものを
void needs_param (void * param, ...);
、いくつかのパラメータの値に依存しますparam
。引数param
は関数によって計算されます。
void compute_param (..., void * param);
param
(型、サイズ、値など) の詳細を可能な限り呼び出し元に隠したいと思います。ここで、呼び出し元は関数compute_param
およびを使用する関数needs_param
です。needs_param
と の両方を自由に変更できる場合、これを最も効率的かつスレッドセーフに実装する方法はcompute_param
?
以下の可能性を考慮し、除外しました。
a:を自由に変更できるため、これを行う 1 つの方法は、 の代わりに とその引数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 を使用する 1 つのソリューション
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
、非表示にしたい呼び出し元スペースのサイズに関する情報が必要です。
何か提案はありますか?