結構體中 char a[0] 用法 -- 柔性數組

看源碼時,發現不少的結構體最後都定義了一個元素個數爲0個的數組,例:數組

typedef struct{ 
char a; 
char b[0]; 
};性能

其中 char b[0], 叫作柔性數據。編碼

這是個普遍使用的常見技巧,經常使用來構成緩衝區。比起指針,用空數組有這樣的優點:  
1.不須要初始化,數組名直接就是所在的偏移  
2.不佔任何空間,指針須要佔用int長度空間,空數組不佔任何空間。  
 
「這個數組不佔用任何內存」,意味着這樣的結構節省空間;「該數組的內存地址就和他後面的元素的地址相同」,意味着無需初始化,數組名就是後面元素的地址,直接就能當作指針使用。  
 
這樣的寫法最適合製做動態buffer。由於能夠這樣分配空間:  
malloc(sizeof(struct  XXX)+  buff_len);  
看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也很是方便,由於如今空數組其實變成了buff_len長度的數組了。  


這樣的好處是:  
一次分配解決問題,省了很多麻煩。你們知道爲了防止內存泄漏,若是是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。

其次,分配了第二個緩衝區之後,若是結構裏面用的是指針,還要爲這個指針賦值。一樣,在free這個buffer的時候,用指針也要兩次free。若是用空數組,全部問題一次解決。  
其次,你們知道小內存的管理是很是困難的,若是用指針,這個buffer的struct部分就是小內存了,在系統內存在多了勢必嚴重影響內存管理的性能。要是用空數組把struct和實際數據緩衝區一次分配大塊問題,就沒有這個問題。  
 
如此看來,用空數組既簡化編碼,又解決了小內存碎片問題提升了性能,何樂不爲?應該普遍採用。  
 
若是你作過操做系統的開發或者嵌入式開發,這種技巧應該是見得濫了呵呵。

操作系統

相關文章
相關標籤/搜索