go slice 擴容

擴容

slice 會遷移到新的內存位置,新底層數組的長度也會增加,這樣就可以放置新增的元素。同時,為了應對未來可能再次發生的 append 操作,新的底層數組的長度,也就是新 slice 的容量是留了一定的 buffer 的。否則,每次添加元素的時候,都會發生遷移,成本太高。
新 slice 預留的 buffer 大小是有一定規律的。

1.18之前

當原 slice 容量小于 1024 的時候,新 slice 容量變成原來的 2 倍;原 slice 容量超過 1024,新 slice 容量變成原來的1.25倍。

func growslice(et *_type, old slice, cap int) slice {// ……newcap := old.capdoublecap := newcap + newcapif cap > doublecap {newcap = cap} else {if old.len < 1024 {newcap = doublecap} else {for newcap < cap {newcap += newcap / 4}}}// ……capmem = roundupsize(uintptr(newcap) * ptrSize)newcap = int(capmem / ptrSize)
}

在這里插入圖片描述

1.18之后

當原slice容量(oldcap)小于256的時候,新slice(newcap)容量為原來的2倍;原slice容量超過256,新slice容量newcap = oldcap+(oldcap+3*256)/4。

func growslice(et *_type, old slice, cap int) slice {// ……newcap := old.capdoublecap := newcap + newcapif cap > doublecap {newcap = cap} else {const threshold = 256if old.cap < threshold {newcap = doublecap} else {for 0 < newcap && newcap < cap {// Transition from growing 2x for small slices// to growing 1.25x for large slices. This formula// gives a smooth-ish transition between the two.newcap += (newcap + 3*threshold) / 4}if newcap <= 0 {newcap = cap}}}// ……capmem = roundupsize(uintptr(newcap) * ptrSize)newcap = int(capmem / ptrSize)
}

從小切片的2倍增長轉變為大切片的1.25倍增長,這個公式在兩者之間提供了一個平穩的過渡。
調整之后,隨著切片容量的變大,增長比例逐漸向著1.25進行靠攏。slice擴容整體的增長曲線變得更加平滑。

在這里插入圖片描述
擴容時除了擴容成指定大小之外,還做了內存對齊,進行內存對齊之后,新slice的容量 >= newcap。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14084.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】STL快速入門基礎

文章目錄 STL&#xff08;Standard Template Library&#xff09;1、一般介紹2、STL的六大組件2.1、STL容器2.2、STL迭代器2.3、相關容器的函數vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

LabVIEW2022安裝教程指南【附安裝包】

文章目錄 前言一、安裝指南1、軟件包獲取 二、安裝步驟總結 前言 LabVIEW是一種程序開發環境&#xff0c;提供一種圖形化編程方法&#xff0c;可可視化應用程序的各個方面&#xff0c;包括硬件配置、測量數據和調試&#xff0c;同時可以通過FPGA數學和分析選板中的NI浮點庫鏈接…

有趣的css - 兩個圓形加載效果

大家好&#xff0c;我是 Just&#xff0c;這里是「設計師工作日常」&#xff0c;今天分享的是一款小清新的加載動畫&#xff0c;適用于 app 列表加載&#xff0c;頁面加載或者彈層內容延遲加載等場景。 最新文章通過公眾號「設計師工作日常」發布。 目錄 整體效果核心代碼html…

AWS安全性身份和合規性之Amazon Macie

Amazon Macie是一項數據安全和數據隱私服務&#xff0c;它利用機器學習&#xff08;ML&#xff09;和模式匹配來發現和保護敏感數據。可幫助客戶發現、分類和保護其敏感數據&#xff0c;以及監控其數據存儲庫的安全性。 應用場景&#xff1a; 敏感數據發現 一家金融服務公司…

20年交易老兵悟出的寶貴經驗,做到這10點或許你也能躺著賺錢

交易要靠親身體驗來真正獲得發展&#xff0c;在正確引導下&#xff0c;我們就不會把時間和精力浪費在彎路上。交易之技易學&#xff0c;實難在心態與思考。接下來&#xff0c;我將與您分享一位交易了20年的老兵所積累的10條珍貴經驗。 Nial Fuller,一個交易了接近20年的市場“老…

Git遠程控制

文章目錄 1. 創建倉庫1.1 Readme1.2 Issue1.3 Pull request 2. 遠程倉庫克隆3. 推送遠程倉庫4. 拉取遠程倉庫5. 配置Git.gitignore配置別名 使用GitHub可以&#xff0c;采用Gitee也行 1. 創建倉庫 1.1 Readme Readme文件相當于這個倉庫的說明書&#xff0c;gitee會初始化2兩份…

go mod模式下,import gitlab中的項目

背景 為了go項目能夠盡可能復用代碼&#xff0c;把一些公用的工具類&#xff0c;公用的方法等放到共用包里統一管理。把共用包放到gitlab的私有倉庫中。 遇到的問題 通過https方式&#xff0c;執行go get報了錯誤。 通過ssh方式&#xff0c;執行go get報了錯誤。 修改配置&am…

介紹一個免費的在線pdf轉word網站

Smallpdf.com - A Free Solution to all your PDF Problems 轉換效果不錯&#xff0c;比那些收費的軟件強多了&#xff0c;主要是免費的&#xff01;

面試八股之MySQL篇2——索引篇

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…

Springboot階段項目---《書城項目》

一 項目介紹 本項目采用集成開發平臺IntelliJ IDEA開發了在線作業成績統計系統的設計與實現&#xff0c;實現了圖書商城系統的綜合功能和圖形界面的顯示&#xff0c;可以根據每個用戶登錄系統后&#xff0c;動態展示書城首頁圖書&#xff0c;實現了分類還有分頁查詢&#xff0c…

進程、線程——面經(一)

1、什么是進程&#xff08;Process&#xff09;&#xff0c;線程&#xff08;Thread&#xff09;&#xff0c;有什么區別&#xff1f; 進程&#xff08;Process&#xff09;&#xff1a; 定義&#xff1a; 進程是一個獨立的執行環境&#xff0c;它擁有獨立的內存空間&#xf…

Linux應用入門(二)

1. 輸入系統應用編程 1.1 輸入系統介紹 常見的輸入設備有鍵盤、鼠標、遙控桿、書寫板、觸摸屏等。用戶經過這些輸入設備與Linux系統進行數據交換。這些設備種類繁多&#xff0c;如何去統一它們的接口&#xff0c;Linux為了統一管理這些輸入設備實現了一套能兼容所有輸入設備的…

怎么壓縮pdf pdf在線壓縮 pdf文件壓縮大小

pdf文件無論在何種設備上打開&#xff0c;PDF文件都能保持其原始的布局和格式&#xff0c;這對于文檔共享和打印非常重要。PDF不僅支持文本&#xff0c;還能嵌入圖像、視頻、音頻以及動態鏈接等元素。PDF文件支持加密和密碼保護&#xff0c;可以限制訪問、編輯、復制或打印文檔…

C語言----深入理解指針(3)

1.字符指針變量 //int main() //{ // char ch w; // char*pc&ch; // printf("%c", *pc); // return 0; //}/*int main() {//char* p "abcdef";//char arr[] "abcdef";//常量字符串 a b c d e f \0//char* pc arr;//將數組首…

高防IP是什么意思?

在網絡安全中&#xff0c;企業和用戶經常會受到網絡攻擊和流量攻擊&#xff0c;比如DDOS攻擊和CC攻擊等&#xff0c;那么對于這些網絡攻擊&#xff0c;企業和用戶有什么解決方案呢&#xff1f; 對于網絡攻擊&#xff0c;高防IP是一種針對網絡攻擊和分布式拒絕服務攻擊設計的IP解…

【002】FlexBison原理分析

0. 前言 Flex和Bison是用于構建處理結構化輸入的程序的工具。它們最初是用于構建編譯器的工具&#xff0c;但它們已被證明在許多其他領域都很有用。 &#xfeff; 在第一章中&#xff0c;我們將首先看一點(但不是太多)它們背后的理論&#xff0c;然后我們將深入研究一些使用它…

K8S認證|CKA題庫+答案| 5. 創建 Ingress

5 . 創建 Ingress 您必須在以下Cluster/Node上完成此考題&#xff1a; Cluster Master node Worker node k8s master …

基于Tensorflow卷積神經網絡垃圾智能分類系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著城市化進程的加速&#xff0c;垃圾問題日益嚴重&#xff0c;垃圾分類成為解決這一問題的關…

淺談金融行業數據安全分類分級

數據安全管理是一項從上而下的、多方配合開展的工作。在進行數據安全管理組織架構建設時&#xff0c;需要從上而下建設&#xff1b;從而全面推動數據安全管理工作的執行和落地&#xff1b;以保證數據安全的合法合規、并長效推動業務的發展和穩定運行。 金融行業機構應設立數據…