深度剖析:std::vector 內存機制與 push_back 擴容策略

深度剖析:std::vector 內存機制與 push_back 擴容策略

1. std::vector 核心內部結構
std_vector_int
-T* _M_start(元素數組起始指針)
-T* _M_finish(最后元素后位置)
-T* _M_end_of_storage(分配內存末尾)
+size()
+capacity()
+push_back(const T& value)

三個核心成員變量

  1. _M_start:指向堆內存中數組起始位置
  2. _M_finish:指向最后一個有效元素的下一個位置
  3. _M_end_of_storage:指向分配內存的末尾位置

內存布局
在這里插入圖片描述


2. 默認構造的真實狀態
0
默認構造
內存狀態:
_M_start
=
nullptr
_M_finish
_M_end_of_storage
內存狀態
容量計算:
size()
capacity()
堆分配:
無堆內存分配

關鍵事實

  • 默認構造后 sizeof(vector) = 24字節(64位系統)
  • 三指針均為 nullptr
  • 零堆內存分配,完全空狀態

3. push_back 擴容策略(元素數 ≤ 256)

在這里插入圖片描述

指數增長算法(元素數 ≤ 256):

插入次數擴容后容量持續時間
初始狀態00
111
221
342
584
9168
173216
336432
6512864
129256128
257512256

關鍵擴容規則

  1. 初始分配:首次 push_back 分配1個元素空間
  2. 指數增長:每次容量翻倍(1→2→4→8→16→…)
  3. 256閾值:達到256元素后切換為固定增量(GCC:+50%,MSVC:+50%)
  4. 元素遷移
    • C++11前:復制構造(深拷貝)
    • C++11后:優先移動語義(noexcept移動構造函數)

4. 內存分配與遷移細節

擴容過程可視化(從4元素→8元素):

UserVectorHeapOldHeapNewpush_back(元素5)檢查容量(4=4? 需要擴容)計算新容量 = 8分配8*sizeof(int)內存返回新地址0x2000讀取元素0(0x1000)寫入元素0(0x2000)讀取元素1(0x1004)寫入元素1(0x2004)讀取元素2(0x1008)寫入元素2(0x2008)讀取元素3(0x100C)寫入元素3(0x200C)loop[遷移元素]寫入新元素5(0x2010)釋放0x1000內存更新指針:_M_start=0x2000_M_finish=0x2014_M_end_of_storage=0x2020UserVectorHeapOldHeapNew

指針更新邏輯

  • _M_start = 新內存起始地址
  • _M_finish = 新內存起始 + 元素數量 * sizeof(T)
  • _M_end_of_storage = 新內存起始 + 新容量 * sizeof(T)

5. 性能優化數學原理

均攤時間復雜度 O(1) 證明
在這里插入圖片描述

預分配優化效果
在這里插入圖片描述


6. 與固定數組的本質區別

內存模型對比

堆內存
棧內存
固定大小
固定大小
動態大小
動態數組
連續棧空間
int arr[10]
連續棧空間
std::array
PtrStart
vector控制塊
PtrFinish
PtrEndStorage
不可擴容
可擴容

操作代價對比

操作std::vectorstd::arrayint[10]
隨機訪問O(1)O(1)O(1)
尾部插入均攤O(1)不可不可
中間插入O(n)不可不可
內存占用24B+堆空間40B40B
擴容能力???

終極結論:std::vector 設計哲學

  1. 按需分配

    • 默認構造零開銷
    • 首次 push_back 最小分配(1元素)
    • 指數增長優化插入效率
  2. 三指針精妙設計

    template <class T>
    class vector {T* _M_start;          // 數組起始T* _M_finish;         // 最后一個元素后T* _M_end_of_storage; // 內存塊末尾
    };
    
    • 實現 O(1) 的 size()capacity()
    • 高效計算剩余空間
  3. 256不是魔法數字

    • 所有實現仍使用指數增長
    • GCC/Clang:嚴格2倍增長
    • MSVC:1.5倍增長(更內存友好)
  4. 性能優先策略

    小數據
    棧上控制塊+堆數據
    預分配
    避免重復擴容
    移動語義
    減少復制開銷
    媲美數組性能

黃金實踐

// 最優使用模式
std::vector<int> vec;          // 零開銷創建
vec.reserve(estimated_size);   // 預分配避免擴容for(int i = 0; i < N; ++i) {vec.push_back(i);           // 無擴容開銷
}// 等效于固定數組性能

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

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

相關文章

GROW領導力模型

GROW領導力模型是由英國教練格雷厄姆亞歷山大&#xff08;Graham Alexander&#xff09;、艾倫Fine和約翰惠特默&#xff08;John Whitmore&#xff09;在20世紀80年代提出的&#xff0c;最初用于體育教練領域&#xff0c;后來被廣泛應用于企業管理、領導力發展和個人成長中。它…

打破并發瓶頸:虛擬線程實現詳解與傳統線程模型的性能對比

目錄 一、定義與特性 二、虛擬線程實現 2.1 使用 Thread.startVirtualThread() 創建 2.2 使用 Thread.ofVirtual() 創建 2.3 使用 ThreadFactory 創建 2.4 使用 Executors.newVirtualThreadPerTaskExecutor()創建 三、虛擬線程和普通線程的區別 3.1 線程管理方式不同 3…

“28項評測23項SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B級視覺語言模型的性能天花板!

一、模型介紹 GLM-4.1V-9B-Thinking是由智譜AI聯合清華大學團隊推出的多模態大模型&#xff0c;以GLM-4-9B-0414基座模型為底&#xff0c;通過引入“思維鏈推理機制”和“課程采樣強化學習策略”&#xff08;Reinforcement Learning with Curriculum Sampling&#xff09;&…

推薦系統-Random算法

Random算法總結引言 在推薦系統研究與應用中&#xff0c;我們常常需要一些簡單的基線算法來衡量更復雜算法的性能提升。Random&#xff08;隨機推薦&#xff09;算法是最基礎的基線方法之一&#xff0c;它通過隨機生成評分來模擬用戶對物品的偏好。雖然這種方法看似簡單&#x…

Django--02模型和管理站點

Django–02模型與站點管理 Part 2: Models and the admin site 本教程承接Django–01的內容。我們將設置數據庫、創建你的第一個模型&#xff0c;并快速了解 Django 自動生成的管理站點。 文章目錄Django--02模型與站點管理前言一、設置數據庫1.1 參考文檔鏈接1.2 默認設置1.3…

CS課程項目設計1:交互友好的井字棋游戲

最近突然想開設一個專欄了&#xff0c;專門為計算機專業的同行分享一些入門級的課程項目設計&#xff0c;旨在讓同學更好地了解CS項目的設計流程&#xff0c;同時給出代碼來介紹coding過程。 今天要分享的是第一個CS課程項目&#xff1a;交互友好的井字棋游戲。 1. 研究目的 井…

首個自動駕駛VLA綜述介紹

當視覺(Vision)、語言(Language)和行動(Action)三大能力在一個模型中融合,自動駕駛的未來將走向何方? 近日,來自麥吉爾大學、清華大學、小米公司和威斯康辛麥迪遜的研究團隊聯合發布了全球首篇針對自動駕駛領域的視覺-語言-行動(Vision-Language-Action, VLA)模型的…

C# 接口(接口可以繼承接口)

接口可以繼承接口 之前我們已經知道接口實現可以從基類被繼承&#xff0c;而接口本身也可以從一個或多個接口繼承而來。要指定某個接口繼承其他的接口&#xff0c;應在接口聲明中把基接口名稱以逗號分隔的列表形式 放在接口名稱后面的冒號之后&#xff0c;如下所示。類在基類列…

linux----------------------線程同步與互斥(上)

1.線程互斥 1-1 進程線程間的互斥相關背景概念 臨界資源&#xff1a;多線程執行流共享的資源就叫做臨界資源 臨界區&#xff1a;每個線程內部訪問臨界資源的代碼就叫做臨界區 互斥&#xff1a;任何時刻&#xff0c;互斥保證只有一個執行進入臨界區&#xff0c;對臨界資源起…

百度AI的開放新篇章:文心4.5本地化部署指南與未來生態戰略展望

百度AI的開放新篇章&#xff1a;文心4.5本地化部署指南與未來生態戰略展望 一起來玩轉文心大模型吧&#x1f449;文心大模型免費下載地址&#xff1a;https://ai.gitcode.com/theme/1939325484087291906 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30…

筆記/sklearn中的數據劃分方法

文章目錄一、前言二、數據劃分方法1. 留出法&#xff08;Hold-out&#xff09;2. K折交叉驗證&#xff08;K-Fold&#xff09;3. 留一法&#xff08;Leave-One-Out&#xff09;三、總結一、前言 簡要介紹數據劃分在機器學習中的作用。 二、數據劃分方法 1. 留出法&#xff0…

Android14 開屏頁SplashScreen設置icon圓角的原理

簡介 我們在看到一個應用在啟動的時候會看到一個啟動的icon,這個圖標是應用的icon當然也是可以應用自己去控制的如 <item name="android:windowSplashScreenAnimatedIcon">@drawable/adas_icon</item> 圖上的效果明顯不理想,圖標是自帶圓角,而且還是…

flutter redux狀態管理

&#x1f4da; Flutter 狀態管理系列文章目錄 Flutter 狀態管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用詳解&#xff1a;原理及注意事項 InheritedWidget 組件使用及原理 Flutter 中 Provider 的使用、注…

AMIS全棧低代碼開發

amis是百度開源的前端低代碼框架&#xff0c;它通過JSON配置來生成各種后臺頁面&#xff0c;旨在簡化前端開發過程&#xff0c;提高開發效率&#xff0c;降低開發門檻。以下是詳細介紹&#xff1a; 核心特點&#xff1a; 可視化開發&#xff1a;允許開發者通過可視化方式構建頁…

【Python基礎】變量、運算與內存管理全解析

一、刪除變量與垃圾回收&#xff1a;內存管理的底層邏輯 在Python中&#xff0c;變量是對象的引用&#xff0c;而不是對象本身。當我們不再需要某個變量時&#xff0c;可以用del語句刪除它的引用&#xff0c;讓垃圾回收機制&#xff08;GC&#xff09;自動清理無引用的對象。 1…

Spring Boot + Javacv-platform:解鎖音視頻處理的多元場景

Spring Boot Javacv-platform&#xff1a;解鎖音視頻處理的多元場景 一、引言 在當今數字化時代&#xff0c;音視頻處理已成為眾多應用場景中不可或缺的一部分&#xff0c;從在線教育、視頻會議到短視頻平臺、智能安防等&#xff0c;音視頻數據的處理與分析需求日益增長。Java…

k8s 的基本原理、架構圖、使用步驟和注意事項

Kubernetes&#xff08;k8s&#xff09;是一個開源的容器編排平臺&#xff0c;用于自動化部署、擴展和管理容器化應用。以下是其基本原理、使用步驟和注意事項的總結&#xff1a;一、k8s 基本原理核心架構 Master 節點&#xff1a;控制集群的核心組件&#xff0c;包括&#xff…

Qt 多線程編程:單例任務隊列的設計與實現

引言&#xff1a; 在現代應用程序開發中&#xff0c;多線程編程已成為處理異步任務的標配。對于 GUI 應用而言&#xff0c;保持主線程的響應性尤為重要。本文將詳細介紹一個基于 Qt 的單例任務隊列實現方案&#xff0c;它通過線程池和單例模式&#xff0c;優雅地解決了后臺任務…

OpenEuler操作系統中檢測插入的USB設備并自動掛載

OpenEuler操作系統中檢測插入的USB設備并自動掛載 項目需求&#xff1a;工控機上openeuler操作系統是無界面版本的&#xff0c;在工控機上連接了激光雷達&#xff0c;當激光雷達采集完數據&#xff0c;我們要將采集數據導入u盤&#xff0c;故需要在工控機上插入u盤&#xff0c;…

《Spring 中上下文傳遞的那些事兒》Part 11:上下文傳遞最佳實踐總結與架構演進方向

&#x1f4dd; Part 11&#xff1a;上下文傳遞最佳實踐總結與架構演進方向 經過前面幾篇文章的深入探討&#xff0c;我們已經系統性地學習了 Spring 應用中上下文傳遞的各種技術原理、常見問題以及解決方案。從 Web 請求上下文到異步任務、從多租戶隔離到日志脫敏&#xff0c;…