Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中隐藏数据的传输_C_Performance - Fatal编程技术网

C语言中隐藏数据的传输

C语言中隐藏数据的传输,c,performance,C,Performance,在C程序中考虑以下情况。我们有一组函数,让泛型函数为 void needs_param (void * param, ...); ,这取决于某些参数的值param。参数param由函数计算,例如 void compute_param (..., void * param); 我们希望尽可能向调用者隐藏参数(类型、大小、值等)的详细信息,调用者是使用函数计算参数和需要参数的函数。如果您可以自由修改needs_-param和compute_-param,如何最有效地实现这一点并保证线程安全

C程序中考虑以下情况。我们有一组函数,让泛型函数为

 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 &param;
}
但是,这不是线程安全的,使用
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
,使用动态内存分配。