C++:std::array vs 原生數組 vs std::vector

📌 C++:std::array vs 原生數組 vs std::vector

引用

  1. C/C++ 標準庫 std::vector、std::array、原生靜態數組 的區別有哪些?

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

  3. 今天過去了 還有許許多個明天

  4. 能和大家走到這里 實在是很有緣分呢 我很開心

  5. 說不定 我活得比你們都久呢

// 基礎聲明對比
int native_arr[10];                          // 原生靜態數組
std::array<int, 10> std_arr;                 // C++11 std::array
std::vector<int> dynamic_vec(10);            // 動態數組

🔍 核心差異解析

🛡? 1. 內存安全機制

native_arr[15] = 42;     // ?? 靜默越界 - 未定義行為!
std_arr.at(15) = 42;     // 🚨 Debug下觸發斷言異常
  • std::array通過重載operator[]添加邊界檢查
  • Debug模式:嚴格邊界檢查(基于_ITERATOR_DEBUG_LEVEL
  • Release模式:邊界檢查被優化移除,性能≈原生數組

🧩 2. 內存布局差異

// new Foo[5] 內存布局:
// [計數器][Foo0][Foo1][Foo2][Foo3][Foo4]
// ^ 額外分配計數器用于delete[]// new std::array<Foo,5> 內存布局:
// [Foo0][Foo1][Foo2][Foo3][Foo4]
// ^ 純對象連續存儲
類型new[]開銷適用場景
原生數組額外計數器需兼容C的代碼
std::array零開銷純C++項目

?? 3. 匯編層實現

; 原生數組訪問
mov eax, [arr+4*index]  ; 直接內存偏移; std::array訪問
mov ecx, this           ; 加載this指針
call array::operator[]  ; 調用成員函數
  • 代價:多1條寄存器操作指令
  • 優化:Release模式下函數可內聯消除開銷

📊 性能關鍵點對比表

特性原生數組std::arraystd::vector
邊界檢查? 無?? 僅Debug?? 僅Debug
棧分配???(元素在堆)
內存開銷0024字節(64位)
迭代器支持???
傳遞語義退化指針值傳遞引用傳遞

🚀 std::vector動態數組深度優化

🔄 擴容策略對比

// VC++擴容算法 (簡化偽代碼)
size_type _Calculate_growth(size_type _Newsize) {if(_Oldcapacity > _Max - _Oldcapacity/2) return _Max;  // 防溢出return max(_Newsize, _Oldcapacity + _Oldcapacity/2); // 1.5倍
}// GCC優化:小容量時加倍擴容
if(capacity() < 256) new_cap = max(_Newsize, capacity() * 2);
編譯器小容量策略大容量策略
MSVC1.5倍增長線性增長
GCC2倍增長(≤256元素)1.5倍增長

?? 使用禁忌場景

// 錯誤示范:循環內push_back導致頻繁擴容
for(int i=0; i<1000000; ++i){vec.push_back(i);   // 😱 潛在O(n2)性能災難
}// 正確做法:預分配空間
vec.reserve(1000000);   // ? 單次分配
  • 內存陷阱clear()不釋放容量(需shrink_to_fit()
  • 替代方案:頻繁擦寫→std::list,固定大小→std::array

💎 工程實踐建議

  1. 安全優先:默認使用std::array替代原生數組
    // 傳統C風格替換
    void legacy_func(int arr[10]);       // ? 指針退化風險
    void modern_func(std::array<int,10>);// ? 保持類型信息
    
  2. 性能敏感:確認編譯器的std::vector實現策略
  3. 內存控制:監控capacity()避免空洞內存
    vector<int> vec;
    vec.resize(1000000);  // 分配1M空間
    vec.clear();          // size=0, capacity仍為1M!
    vec.shrink_to_fit();  // 釋放多余內存
    
  4. 終極優化:定制分配器(僅限高級場景)
    std::vector<int, MyCustomAllocator> opt_vec; 
    

🌟 結論選擇樹

在這里插入圖片描述

📌 核心原則:避免教條主義,根據實際場景選擇工具鏈,理解底層機制才能寫出工業級代碼!

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

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

相關文章

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安裝自動補全主節點安裝就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安裝Calico網絡插件&#xff08;主節點&#xff09;下載文件wget https://ca…

VBA代碼解決方案第二十七講:禁用EXCEL工作簿右上角的關閉按鈕

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Spring AI 系列之三十一 - Spring AI Alibaba-基于Nacos的MCP

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

sqli-labs:Less-12關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff0…

【SpringAI】8.通過json動態添加mcp服務

前言 官方示例的代碼中&#xff0c;mcp一般是配置到yml中或者json文件中&#xff0c;使用自動裝配的方式注入服務&#xff0c;這種方式不方便在程序啟動后添加新的服務&#xff0c;這里參考cherry studio的方式動態添加mcp服務 1.確定方案 mcp服務的維護放到mysql業務數據庫維…

【PDF + ZIP 合并器:把ZIP文件打包至PDF文件中】

B站鏈接 PDF ZIP 合并器&#xff1a;把ZIP文件打包至PDF文件中_嗶哩嗶哩_bilibiliz 加強作者的工具 https://wwgw.lanzn.com/i8h1C32k9bef 密碼:30cv 新增c框架&#xff0c;加快運行速度

阿里云部署微調chatglm3

git Ifs install Git lfs 主要用于管理大型文件。在傳統的Git倉庫中&#xff0c;所有文件內容都會被完整記錄在每一次提交中&#xff0c;這會導致倉庫體積增大&#xff0c;克隆、拉取和推送操作變慢&#xff0c;甚至可能超出存儲限額。Git LFS通過將大文件替換成文本指針&#…

Linux網絡編程 ---五種IO模型

五種IO模型一、IO慢的原因二、五種IO模型三、如何設置非阻塞式IO&#xff1f;一、IO慢的原因 二、五種IO模型 阻塞式IO 非阻塞式IO 信號驅動IO 多路轉接 異步IO 三、如何設置非阻塞式IO&#xff1f; &#xff08;一&#xff09;用法說明 &#xff08;二&#xff0…

Obsidian結合CI/CD實現自動發布

CI/CDQuickAddJS腳本bat腳本sh腳本實現自動發版Hugo文章 需求來源 每次手動執行Hugo的命令&#xff0c;手動把public文件夾上傳到自己的服務器可以完成發版需求。 但是&#xff0c;作為一個內容創作者&#xff0c;我更希望的關注于自己的內容&#xff0c;而不是關注整個發版…

[硬件電路-141]:模擬電路 - 源電路,信號源與電源,能自己產生確定性波形的電路。

源電路&#xff08;Source Circuit&#xff09;是電子系統中為其他電路或負載提供特定信號或能量的基礎電路模塊&#xff0c;其核心功能是生成、調節或轉換所需的物理量&#xff08;如電壓、電流、波形、頻率等&#xff09;。以下是源電路的詳細解析&#xff1a;一、源電路的核…

Unity_數據持久化_PlayerPrefs基礎

Unity數據持久化 一、數據持久化基礎概念 1.1 什么是數據持久化 定義&#xff1a; 數據持久化就是將內存中的數據模型轉換為存儲模型&#xff0c;以及將存儲模型轉換為內存中的數據模型的統稱。 通俗解釋&#xff1a; 將游戲數據存儲到硬盤&#xff0c;硬盤中數據讀取到游戲中&…

什么是列存儲(Columnar Storage)?深度解析其原理與應用場景

列存儲的基本概念&#xff1a;顛覆傳統的數據組織方式列存儲&#xff08;Column Storage&#xff09;是一種革命性的數據庫存儲技術&#xff0c;它通過按列而非按行組織數據&#xff0c;從根本上改變了數據的物理存儲結構。與傳統行存儲數據庫不同&#xff0c;列式數據庫將每一…

機器人抓取流程介紹與實現——機器人抓取系統基礎系列(七)

機器人抓取系統基礎系列文章目錄 1. UR機械臂的ROS驅動安裝官方教程詳解——機器人抓取系統基礎系列&#xff08;一&#xff09; 2. MoveIt控制機械臂的運動實現——機器人抓取系統基礎系列&#xff08;二&#xff09; 3. 機器人&#xff08;機械臂&#xff09;的相機選型與安裝…

【Qt】QObject::startTimer: Timers cannot be started from another thread

QTimer對象的 start 函數調用必須和創建QTimer對象是同一個線程。 #include "QtTimerTest.h" #include <QDebug>QtTimerTest::QtTimerTest(QWidget *parent): QMainWindow(parent),m_timer(nullptr),m_timerThread(nullptr), m_workingThread(nullptr) {ui.set…

社會治安滿意度調查:為城市安全治理提供精準參考(滿意度調查公司)

在社會治理不斷深化的背景下&#xff0c;公眾對社會治安的感知與評價已成為衡量城市治理水平的重要維度&#xff08;社會治安滿意度調查&#xff09;&#xff08;公眾滿意度調查&#xff09;&#xff08;滿意度調查&#xff09;。為全面掌握市民對治安狀況的真實反饋&#xff0…

Python篇--- Python 的加載、緩存、覆蓋機制

要理解 import 與 if __name__ "__main__": 的關系&#xff0c;以及 Python 的加載、緩存、覆蓋機制&#xff0c;我們可以從 “模塊的兩種身份” 和 “導入的全過程” 入手&#xff0c;用通俗的例子一步步拆解。一、核心&#xff1a;模塊的 “雙重身份” 與 __name_…

Java設計模式之行為型模式(訪問者模式)應用場景分析

訪問者模式&#xff08;Visitor Pattern&#xff09;作為Java設計模式中的“隱形冠軍”&#xff0c;常被開發者低估其價值。這一模式通過“雙分派”機制巧妙解耦數據結構與操作&#xff0c;為復雜系統的擴展提供了強大武器。在大廠項目中&#xff0c;訪問者模式往往出現在業務邏…

【IDEA】JavaWeb自定義servlet模板

方法一&#xff1a;&#xff08;推薦去使用方法二&#xff0c;還能創建其它代碼模板&#xff09;使用servlet模板創建Servlet類如果創建時找不到servlet模板&#xff1a;File -> Project Structure然后應用 -> OK&#xff0c;如果還是找不到Servlet模板&#xff0c;看看項…

Linux選擇

在內存中運行著的進程稱為&#xff08; 服務 &#xff09;。負責控制systemd系統和服務管理器的工具為&#xff08; systemctl &#xff09;命令。systemd管理系統服務的基本單位是&#xff08; unit &#xff09;。分配和管理資源的基本單位是&#xff08; 進程 &#xf…

【Redis學習路|第一篇】初步認識Redis

概要: 深入探討NoSQL數據庫的核心特性&#xff0c;對比傳統關系型數據庫的差異&#xff0c;重點介紹Redis作為內存數據庫的優勢與應用場景。 文章目錄認識 NoSQLNoSQL vs SQL 對比1?? 結構化 vs 非結構化2?? 關聯 vs 非關聯3?? 查詢方式對比4?? 事務特性5?? 存儲方式…