當前位置:編程學習大全網 - 源碼下載 - Slice 擴容機制解惑

Slice 擴容機制解惑

大家都知道slice擴容機制, 在切片長度小於1024時會擴容為原來的2倍,超過1024擴容為原來的1.25倍 。

其實這僅僅是slice擴容第壹步的其中壹個條件,還存在第二條件( if cap > doublecap ),並且還有第二步: 內存對齊 ,看源碼妳就知道了:

看兩個例子吧:

若按最開始的結論,妳可能會這麽想:

原 slice 容量小於 1024,擴容時容量每次增加 1 倍。添加元素 4 的時候,容量變為4;添加元素 5 的時候不變;添加元素 6 的時候容量增加 1 倍,變成 8。所以妳的結論是: len=5, cap=8

恭喜妳,妳的結論是對的!

和上面壹樣,妳可能會這麽想:

原 slice 容量小於 1024,擴容時容量每次增加 1 倍。添加元素 4 的時候,容量變為4;添加元素 5 的時候不變;添加元素 6 的時候容量增加 1 倍,變成 8。所以妳的結論依然是: len=5, cap=8

這是錯誤的結論!slice擴容 其實遠沒有這麽單純!

growslice 這個函數的參數依次是 元素的類型,老的 slice,新 slice 最小求的容量。

因此正確的運行結果是: len=5, cap=6

按最開始的結論,妳可能會這麽想:

原 slice 容量小於 1024,擴容時容量每次增加 1 倍,添加元素 6 的時候,容量變為10;添加元素7的時候,容量還是夠的,不會擴容,依然為10.所以妳的結論是: len=7, cap=10

那麽恭喜妳這個時候是結論又是對的!

懵逼了沒?崩潰了沒?

為了避免困惑,我們來總結壹下吧:

新舊長度之和,即 最終slice長度

slice在append時,必須關註最終slice的長度是否超過原容量的2倍

最後,執行內存對齊操作,這壹步是壹定不能少的!

如果實在不知道對齊的最終結果,那麽妳按這個規律來找到最接近的值吧: 0、1、2、4、6、8、10、12、14、16、18、20 .... 即2的倍數

就像例二所述,cap=5時,執行內存對齊操作,最終結果是cap=6

最最後,來個小練習:

5.新切片長度不為0時

示例4、5說明是按被追加切片的長度(而不是容量)來計算擴容的。

以上示例是針對長度小於1024的情況,大於1024的情況同樣適用。

  • 上一篇:c++ 完美 源代碼
  • 下一篇:如何將潘仔公式改為選股公式
  • copyright 2024編程學習大全網