巧用空陣列建立動態緩衝區
關於在結構體末尾定義空陣列的用法,以前看到過,一直沒搞懂,在無意中瞄到了答案,實在是三生有幸,阿彌陀佛啊,所以就貼出來大家一起分享:
struct ast_exten ;
又如:
struct ast_include ;
struct ast_ignorepat ;
這是個廣泛使用的常見技巧,常用來構成緩衝區。比起指標,用空陣列有這樣的優勢:
1.不需要初始化,陣列名直接就是所在的偏移
2.不佔任何空間,指標需要占用int長度空間,空陣列不佔任何空間。
「這個陣列不占用任何記憶體」,意味著這樣的結構節省空間;「該陣列的記憶體位址就和他後面的元素的位址相同」,意味著無需初始化,陣列名就是後面元素的位址,直接就能當做指標使用。
這樣的寫法最適合製作動態buffer。因為可以這樣分配空間:
malloc(sizeof(struct ***)+ buff_len);
看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也非常方便,因為現在空陣列其實變成了buff_len長度的陣列了。
這樣的好處是:
一次分配解決問題,省了不少麻煩。大家知道為了防止記憶體洩漏,如果是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須回滾釋放第乙個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩衝區以後,如果結構裡面用的是指標,還要為這個指標賦值。同樣,在free這個buffer的時候,用指標也要兩次free。如果用空陣列,所有問題一次解決。
其次,大家知道小記憶體的管理是非常困難的,如果用指標,這個buffer的struct部分就是小記憶體了,在系統內存在多了勢必嚴重影響記憶體管理的效能。要是用空陣列把struct和實際資料緩衝區一次分配大塊問題,就沒有這個問題。
如此看來,用空陣列既簡化編碼,又解決了小記憶體碎片問題提高了效能,何樂不為?應該廣泛採用。
如果你做過作業系統的開發或者嵌入式開發,這種技巧應該是見得濫了,呵呵。
setvbuf 建立緩衝區函式
原型 setvbuf file restrict fp,char restrict buf,int mode,size t size if setvbuf fp,null,iofbf,bufsize 0 puts error 函式建立了乙個供標準i o函式使用的替換緩衝區,開啟檔案後,在沒有進行任何...
環形緩衝區的建立
建立例項 建立環形快取區 define rbuff set len 8 快取最大長度設定 typedef struct ringbuf st ringbuf st ringbuf 建立乙個ringbuf的緩衝區 void ringbuff init ringbuf st ringbuf me 初始化...
06 緩衝區 一維陣列
緩衝區 在不同速度的裝置之間傳遞資料需要使用緩衝區。scanf函式工作時需要使用乙個叫做輸入緩衝區的緩衝區。使用者在鍵盤上輸入的內容首先進入緩衝區,程式從輸入緩衝區裡獲得數字。先進入緩衝區裡的數字必須首先處理。如果使用者輸入的格式和程式要求的不一致,則會導致從這個資料開始的所有陣列都無法處理。可以使...