當前位置:編程學習大全網 - 源碼下載 - 結構體最後定義壹個空數組,即:char p[0],有什麽意義

結構體最後定義壹個空數組,即:char p[0],有什麽意義

*/ char *cidmatch; /* Caller id to match for this extension */ int priority; /* Priority */ char *label; /* Label */ struct ast_context *parent; /* The context this extension belongs to */ char *app; /* Application to execute */ void *data; /* Data to use (arguments) */ void (*datad)(void *); /* Data destructor */ struct ast_exten *peer; /* Next higher priority with our extension */ const char *registrar; /* Registrar */ struct ast_exten *next; /* Extension with a greater ID */ char stuff[0]; }; 最近看asterisk的源碼,發現很多的結構體最後都定義了壹個元素個數為0個的數組,不知道有何意義,望各位大俠指點,非常感謝!! 又如: struct ast_include { char *name; char *rname; /* Context to include */ const char *registrar; /* Registrar */ int hastime; /* If time construct exists */ struct ast_timing timing; /* time construct */ struct ast_include *next; /* Link them together */ char stuff[0]; }; struct ast_ignorepat { const char *registrar; struct ast_ignorepat *next; char pattern[0]; }; 來自asterisk的源碼中的Pbx.c 文件 --------------------------------------------------------------- 這是個廣泛使用的常見技巧,常用來構成緩沖區。比起指針,用空數組有這樣的優勢: 1.不需要初始化,數組名直接就是所在的偏移 2.不占任何空間,指針需要占用int長度空間,空數組不占任何空間。 “這個數組不占用任何內存”,意味著這樣的結構節省空間;“該數組的內存地址就和他後面的元素的地址相同”,意味著無需初始化,數組名就是後面元素的地址,直接就能當做指針使用。 這樣的寫法最適合制作動態buffer。因為可以這樣分配空間: malloc(sizeof(struct XXX)+ buff_len); 看出來好處沒有?直接就把buffer的結構體和緩沖區壹塊分配了。用起來也非常方便,因為現在kongsuzu其實變成了buff_len長度的數組了。 這樣的好處是: 壹次分配解決問題,省了不少麻煩。大家知道為了防止內存泄漏,如果是分兩次分配(結構體和緩沖區),那麽要是第二次malloc失敗了,必須回滾釋放第壹個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩沖區以後,如果結構裏面用的是指針,還要為這個指針賦值。同樣,在free這個buffer的時候,用指針也要兩次free。如果用空數組,所有問題壹次解決。 其次,大家知道小內存的管理是非常困難的,如果用指針,這個buffer的struct部分就是小內存了,在系統內存在多了勢必嚴重影響內存管理的性能。要是用空數組把struct和實際數據緩沖區壹次分配大塊問題,就沒有這個問題。 如此看來,用空數組既簡化編碼,又解決了小內存碎片問題提高了性能,何樂不為?應該廣泛采用。 而我要說的是: 1.不要指望在所有的編譯器上都能得到比想要的結果 2.從生成的最終代碼來看,這種寫法並沒有性能上的優勢 參照我的工作,我們假設壹個數據報文(及其相關信息是這樣定義的) struct Packet { #if (NAT_SUPPORTED) struct NatInfo natInfo; #endif #if (FIREWALL_SUPPORTED) struct FWInfo fwInfo; #endif char data[0]; }; OK,就寫這麽多,這個結構用來封裝壹個數據報文,如果產品需要支持網絡地址轉換,它就會加壹個附加的NAT信息的結構,如果支持防火墻,同樣的會加壹個防火墻的數據結構,至於是否支持這些特性,是在發布的時候根據市場的需要做出的,只需要更改壹個頭文件中這些宏定義就行了。而data這個指針就起到存放實際的報文數據的作用。 現在我們認為data這個指針可以得到報文數據,他工作的挺好。 突然某壹天壹個市場人員說需要壹款產品,既不需要防火墻也不需要網絡地址轉換,因為用戶不願意為這些額外的功能掏錢,那麽公司就會將這兩個宏關閉然後給這個吝嗇的客戶單獨編譯壹個東西,這時候,錯誤發生了,因為這個結構的大小是0。 據這個例子是要說明,當妳的項目規模達到某個水平的時候,最好采用標準的“最小集”,不要試圖用任何擴展的東西,擴展的最後結果,可能是束縛了自己的手腳。

  • 上一篇:Uboot命令源代碼分析
  • 下一篇:每日提醒源代碼
  • copyright 2024編程學習大全網