2016-08-12 83 views
0

我遇到了序列化函数的实现细节,并且提到结构必须被解压缩和存储的目标内存需要是不透明的缓冲区。
Wiki pedia says
“某些语言,比如C,允许声明不透明记录(结构体),其大小和字段对客户端是隐藏的。客户端可以对这样一个对象执行的唯一操作类型是取其内存地址,产生一个不透明的指针。“目标缓冲区如何不透明?

根据这个指向任何内存地址的指针都是不透明的,因为我们无法控制目标缓冲区开始的内存地址。 那么C中的这种分类就缓冲区而言有什么意义呢?我已经看到,在C++中,对象可以是不透明的,这样做更有意义,因为我们可以创建可以防止更改和抽象数据的对象。

+0

简单地说,C中的“opaque type”与C++中的抽象基类完全相同,除了不透明类型没有自动调用构造函数/析构函数。调用者只能声明一个指向给定类型的对象的指针,从不分配它,也不访问成员。 – Lundin

回答

6

假设你有一个库的头,看起来像这样:

struct lib_data; 

struct lib_data *new_data(); 
void read_data(struct lib_data *data); 
void clean_data(struct lib_data *data); 

还有就是struct lib_data向前声明没有指定其内容。然后,您的应用程序可以做到这一点:

struct lib_data *data = new_data(); 
read_data(data); 
clean_data(data); 

注意,你不知道什么struct lib_data样子,甚至它的大小是什么知识。这就是不透明的含义。但是你可以持有一个指针并传递它。

在库的实现中(您可能访问或不可访问),该结构具有适当的定义,因此可以修改其元素。

例如,库的实现可能是这样的:

struct lib_data { 
    int data1 
    double data2; 
} 

struct lib_data *new_data() 
{ 
    struct lib_data *temp = malloc(sizeof(struct lib_data); 
    temp->data1 = 1; 
    temp->data2 = 3.5; 
    return temp; 
} 

void read_data(struct lib_data *data) 
{ 
    ... 
} 

void clean_data(struct lib_data *data) 
{ 
    free(data); 
} 

所以库可以操纵struct,但使用它的应用程序不能。

+0

非常感谢实用的答案。 – achoora