2016-08-12 77 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