C语言中隐藏数据的传输
在C程序中考虑以下情况。我们有一组函数,让泛型函数为C语言中隐藏数据的传输,c,performance,C,Performance,在C程序中考虑以下情况。我们有一组函数,让泛型函数为 void needs_param (void * param, ...); ,这取决于某些参数的值param。参数param由函数计算,例如 void compute_param (..., void * param); 我们希望尽可能向调用者隐藏参数(类型、大小、值等)的详细信息,调用者是使用函数计算参数和需要参数的函数。如果您可以自由修改needs_-param和compute_-param,如何最有效地实现这一点并保证线程安全
void needs_param (void * param, ...);
,这取决于某些参数的值param
。参数param
由函数计算,例如
void compute_param (..., void * param);
我们希望尽可能向调用者隐藏参数
(类型、大小、值等)的详细信息,调用者是使用函数计算参数
和需要参数
的函数。如果您可以自由修改needs_-param
和compute_-param
,如何最有效地实现这一点并保证线程安全
我已考虑并排除了以下可能性:
a:因为我们可以自由修改needs\u param
,一种方法是传递gen\u param
及其参数,而不是param
,并让needs\u param
自行计算param
。但是,param
的计算成本很高,并且需要多次作为其他函数的参数
b:我们可以实现compute\u 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
大小的信息,我们希望将其隐藏
您有什么建议吗?我建议您使用一种称为“不透明指针”的解决方案。例如,它在Windows内核世界中广泛用于对调用方隐藏对象 首先定义一个指针类型,如
typedef void*pobject代码>
然后,您只能在程序中以这种方式操纵对象。像pobject create_object()
、use_object(pobject)
和free_object(pobject)
这样的一系列函数都使用这种技术
为了确保可以安全地操纵对象,请在对象本身中添加互斥体。您还可以添加对象的大小作为第一个成员,以快速检查对象的性质(是否被其他人操纵?)
然后,在函数中,您真正定义了对象,比如typedef struct{}object\u int、*poobject\u int
。在每个操作它的函数中,只需将不透明指针从pobject
投射到pobject\u int
它确实迫使您使用堆,但如果您不想与调用者共享有关对象的任何信息,这是最合适的解决方案。我建议您使用称为“不透明指针”的解决方案。例如,它在Windows内核世界中广泛用于对调用方隐藏对象
首先定义一个指针类型,如typedef void*pobject代码>
然后,您只能在程序中以这种方式操纵对象。像pobject create_object()
、use_object(pobject)
和free_object(pobject)
这样的一系列函数都使用这种技术
为了确保可以安全地操纵对象,请在对象本身中添加互斥体。您还可以添加对象的大小作为第一个成员,以快速检查对象的性质(是否被其他人操纵?)
然后,在函数中,您真正定义了对象,比如typedef struct{}object\u int、*poobject\u int
。在每个操作它的函数中,只需将不透明指针从pobject
投射到pobject\u int
它确实迫使您使用堆,但如果您不想与调用者共享有关对象的任何信息,这是最合适的解决方案。您有时指的是needs\u-param
(带s),有时指的是needs\u-param
-只是一个疏忽,还是这些不同的东西?c的变体非常常见,但是通常有一对create
/destroy
函数。malloc
解决方案就是惯用的解决方案。所有其他人都向来电者泄露信息或不可重新进入。@gital coulsive。。。thanksI还认为,@JoachimPileborg建议的malloc
-解决方案与创建/销毁功能相结合,如allocate_param
和free_param
,会很好。您有时指的是needs_param
(带s),有时指的是needu param
,只是一种疏忽,或者这些是不同的东西?c的变体非常常见,但是通常有一对create
/destroy
函数。malloc
解决方案就是惯用的解决方案。所有其他人都向来电者泄露信息或不可重新进入。@gital coulsive。。。thanksI还认为,@JoachimPileborg建议的malloc
-解决方案与创建/销毁功能相结合,即allocate_param
和free_param
,使用动态内存分配。