1---结构体中最后一个成员为[0]长度数组的用法
生活随笔
收集整理的這篇文章主要介紹了
1---结构体中最后一个成员为[0]长度数组的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?結構體中最后一個成員為[0]長度數組的用法?2012-04-27 16:03:58
1.不需要初始化,數組名直接就是所在的偏移?
2.不占任何空間,指針需要占用int長度空間,空數組不占任何空間。?
從herryhuang(Herry)的回復看,你只是看到了表面,并沒有想到這種特性是很有利用價值的。“這個數組不占用任何內存”,意味著這樣的結構節省空間;“該數組的內存地址就和他后面的元素的地址相同”,意味著無需初始化,數組名就是后面元素的地址,直接就能當做指針使用。?
這樣的寫法最適合制作動態buffer。因為可以這樣分配空間:?
malloc(sizeof(struct ? XXX)+ ? buff_len);?
看出來好處沒有?直接就把buffer的結構體和緩沖區一塊分配了。用起來也非常方便,因為現在kongsuzu其實變成了buff_len長度的數組了。?
這樣的好處是:?
一次分配解決問題,省了不少麻煩。大家知道為了防止內存泄漏,如果是分兩次分配(結構體和緩沖區),那么要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩沖區以后,如果結構里面用的是指針,還要為這個指針賦值。同樣,在free這個buffer的時候,用指針也要兩次free。如果用空數組,所有問題一次解決。?
其次,大家知道小內存的管理是非常困難的,如果用指針,這個buffer的struct部分就是小內存了,在系統內存在多了勢必嚴重影響內存管理的性能。要是用空數組把struct和實際數據緩沖區一次分配大塊問題,就沒有這個問題。?
如此看來,用空數組既簡化編碼,又解決了小內存碎片問題提高了性能,何樂不為?應該廣泛采用。?
如果你做過操作系統的開發或者嵌入式開發,這種技巧應該是見得濫了呵呵。
分類:?C/C++
這是個廣泛使用的常見技巧,常用來構成緩沖區。比起指針,用空數組有這樣的優勢:?
1.不需要初始化,數組名直接就是所在的偏移?
2.不占任何空間,指針需要占用int長度空間,空數組不占任何空間。?
從herryhuang(Herry)的回復看,你只是看到了表面,并沒有想到這種特性是很有利用價值的。“這個數組不占用任何內存”,意味著這樣的結構節省空間;“該數組的內存地址就和他后面的元素的地址相同”,意味著無需初始化,數組名就是后面元素的地址,直接就能當做指針使用。?
這樣的寫法最適合制作動態buffer。因為可以這樣分配空間:?
malloc(sizeof(struct ? XXX)+ ? buff_len);?
看出來好處沒有?直接就把buffer的結構體和緩沖區一塊分配了。用起來也非常方便,因為現在kongsuzu其實變成了buff_len長度的數組了。?
這樣的好處是:?
一次分配解決問題,省了不少麻煩。大家知道為了防止內存泄漏,如果是分兩次分配(結構體和緩沖區),那么要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩沖區以后,如果結構里面用的是指針,還要為這個指針賦值。同樣,在free這個buffer的時候,用指針也要兩次free。如果用空數組,所有問題一次解決。?
其次,大家知道小內存的管理是非常困難的,如果用指針,這個buffer的struct部分就是小內存了,在系統內存在多了勢必嚴重影響內存管理的性能。要是用空數組把struct和實際數據緩沖區一次分配大塊問題,就沒有這個問題。?
如此看來,用空數組既簡化編碼,又解決了小內存碎片問題提高了性能,何樂不為?應該廣泛采用。?
如果你做過操作系統的開發或者嵌入式開發,這種技巧應該是見得濫了呵呵。
結構體最后使用0或1的長度數組的原因,主要是為了方便的管理內存緩沖區,如果你直接使用指針而不使用數組,那么,你在分配內存緩沖區時,就必須分配結構體一次,然后再分配結構體內的指針一次,(而此時分配的內存已經與結構體的內存不連續了,所以要分別管理即申請和釋放)而如果使用數組,那么只需要一次就可以全部分配出來,(見下面的例子),反過來,釋放時也是一樣,使用數組,一次釋放,使用指針,得先釋放結構體內的指針,再釋放結構體。還不能顛倒次序。
其實就是分配一段連續的的內存,減少內存的碎片化。
總結
以上是生活随笔為你收集整理的1---结构体中最后一个成员为[0]长度数组的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于释放内存的那点事
- 下一篇: 2-结构体的最后一个成员的定义-C语言中