深入淺出之STL源碼分析2_stl與標準庫,編譯器的關系

引言

在第一篇博客中,深入淺出之STL源碼分析1_vector基本操作-CSDN博客

我們將引出下面的幾個問題
1.剛才我提到了我的編譯器版本是g++ 11.4.0,而我們要講解的是STL(標準模板庫),那么二者之間的關系是什么?STL安裝后我們到哪里去看源碼?

2.我們引入了頭文件#include<vector>

這里的vector的內容是什么?

3.vector<int> test_vector; 這中定義方式是干什么?<>的作用是什么?

4.test_vector.push_back(22); 對于stl源碼底層到底做了什么?把對應的數據插入到了哪個地址了?

什么時候分配的虛擬內存?什么時候擴容?什么時候會分配物理內存?

下面我們來重點來說明下問題1.

stl和標準庫的關系

標準庫的代碼都統一在一個命名空間std(Standard的縮寫)中,也就是說std命名空間下的內容屬于C++標準庫(Standard Library),但是并非全部屬于標準模版庫(standard template library, stl),也就是標準模板庫只是標準庫的一部分。

std 是 C++ 標準庫的所有組件所在的命名空間,包含以下類別:

  • ?STL(標準模板庫)?:容器、迭代器、算法、函數對象等。
  • ?非 STL 的標準庫組件:輸入輸出(iostream)、字符串(std::string)、智能指針、多線程(std::thread)、異常處理、類型工具(type_traits)等。

stl的實現與編譯器的關系

C++ 標準庫(含 STL)的源碼由 ?編譯器廠商或開源社區實現,不同編譯器使用不同的實現:

  • ?GCC:使用 ?**libstdc++**?(GNU 標準 C++ 庫),源碼路徑如 /usr/include/c++/版本號
  • ?Clang:默認使用 libstdc++,但可配置為 ?**libc++**?(LLVM 項目開發)。
  • ?MSVC:使用 ?Microsoft STL,僅限 Windows。
  • MinGW 是gcc的windows版本。

每個實現的源碼結構和優化策略不同,但均遵循 C++ 標準。

stl源碼何時安裝到linux?

STL 源碼在 ?安裝編譯器時自動部署,屬于編譯器工具鏈的一部分:

  • ?安裝 GCC:會同時安裝其標準庫(libstdc++)的 ?頭文件(.h/.hpp)?? 和 ?預編譯二進制庫(.so)?。
  • ?頭文件路徑:如?/usr/include/c++/11/vector(GCC 11.4.0 版本)。
  • ?二進制庫路徑:如?/usr/lib/gcc/aarch64-linux-gnu/11/libstdc++.so。

一個疑問?就是一般我們的stl都是頭文件的形式,我們只是需要.h文件就可以使用了,為什么還有一個動態庫呢?

?/usr/lib/gcc/aarch64-linux-gnu/11/libstdc++.so,哪些實現需要放在.cpp中并且形成動態庫呢?

雖然 STL 的模板代碼(如?vector、deque)?完全在頭文件中實現,但標準庫中還有以下內容需要編譯為二進制庫:

?

類別

?

?

示例

?

?**為什么需要二進制庫?**?

?

運行時支持

?

std::exception

std::type_info

需要全局唯一的 RTTI(運行時類型信息)和異常處理機制。

?

動態內存管理

?

operator new

operator delete

全局內存分配器的實現需要跨編譯單元共享。

?

輸入輸出流

?

std::cout

std::fstream

底層文件操作和緩沖區管理需要與操作系統交互,無法完全用頭文件實現。

?

多線程支持

?

std::thread

std::mutex

依賴操作系統原生線程 API(如 pthread),需封裝為二進制接口。

?

數學函數

?

std::sin

std::sqrt

某些數學函數需要鏈接到系統數學庫(如

libm

)。

?

C 標準庫兼容層

?

std::printf

std::malloc

C 標準庫函數(如

printf

)的實現需要預編譯。

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

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

相關文章

(十二)深入了解AVFoundation-采集:人臉識別與元數據處理

&#xff08;一&#xff09;深入了解AVFoundation&#xff1a;框架概述與核心模塊解析-CSDN博客 &#xff08;二&#xff09; 深入了解AVFoundation - 播放&#xff1a;AVFoundation 播放基礎入門-CSDN博客 &#xff08;三&#xff09;深入了解AVFoundation-播放&#xff1…

Kafka 與 RabbitMQ、RocketMQ 有何不同?

一、不同的誕生背景&#xff0c;塑造了不同的“性格” 名稱 背景與目標 產品定位 Kafka 為了解決 LinkedIn 的日志收集瓶頸&#xff0c;強調吞吐與持久化 更像一個“可持久化的分布式日志系統” RabbitMQ 出自金融通信協議 AMQP 的實現&#xff0c;強調協議標準與廣泛適…

配置 Web 服務器練習

一、要求 1.通過https://ip 可以訪問到網站首頁 2.通過 https://ip/private/ 實現用戶訪問控制&#xff0c;僅允許已經添加的 tom&#xff0c;jerry 能夠訪問到 private 子路徑的界面 3.通過 https://ip/vrit/ 實現能夠訪問到將系統 /nginx/virt 目錄下的網頁文件&#xff0…

MySQL索引詳解(下)(SQL性能分析,索引使用)

索引是MySQL性能優化的核心&#xff0c;但如何精準分析查詢瓶頸、合理設計索引&#xff0c;是開發者必須掌握的技能。本文結合實戰案例&#xff0c;系統講解SQL性能分析工具鏈與索引使用技巧&#xff0c;幫助讀者構建高性能數據庫系統。 一、SQL性能分析&#xff1a;從宏觀到微…

招行數字金融挑戰賽數據賽道賽題一

賽題描述&#xff1a;根據提供的用戶行為數據&#xff0c;選手需要分析用戶行為特征與廣告內容的匹配關系&#xff0c;準確預測用戶對測試集廣告的點擊情況&#xff0c;通過AUC計算得分。 得分0.6120&#xff0c;排名60。 嘗試了很多模型都沒有能夠提升效果&#xff0c;好奇大…

ORB-SLAM3和VINS-MONO的對比

直接給總結&#xff0c;整體上orbslam3&#xff08;僅考慮帶imu&#xff09;在初始化階段是松耦合&#xff0c;localmap和全局地圖優化是緊耦合。而vins mono則是全程緊耦合。然后兩者最大的區別就在于vins mono其實沒有對地圖點進行優化&#xff0c;為了輕量化&#xff0c;它一…

安裝typescript時,npm install -g typescript報錯

刪除C:\Users\用戶\下的.npmrc文件,如果你的沒有&#xff0c;看是不是因為將隱藏的項目勾選上了&#xff0c;然后去掉勾選。 重新輸入

[GESP202503 四級] 二階矩陣c++

題目描述 小 A 有一個 n 行 m 列的矩陣 A。 小 A 認為一個 22 的矩陣 D 是好的&#xff0c;當且僅當 。其中 表示矩陣 D 的第 i 行第 j 列的元素。 小 A 想知道 A 中有多少個好的子矩陣。 輸入 第一行&#xff0c;兩個正整數 n,m。 接下來 n 行&#xff0c;每行 m 個整數…

基于flask+pandas+csv的報表實現

基于大模型根據提示詞去寫SQL執行SQL返回結果輸出報表技術上可行的&#xff0c;但為啥還要基于pandas去實現呢&#xff1f; 原因有以下幾點&#xff1a; 1、大模型無法滿足實時性輸出報表的需求&#xff1b; 2、使用大模型比較適合數據量比較大的場景&#xff0c;大模型主要…

Java學習筆記(對象)

一、對象本質 狀態&#xff08;State&#xff09;&#xff1a;通過成員變量&#xff08;Field&#xff09;描述 行為&#xff08;Behavior&#xff09;&#xff1a;通過成員方法&#xff08;Method&#xff09;實現 class Person {String name;int age;void eat() {System.o…

Qt學習Day0:Qt簡介

0. 關于Qt Qt是C的實踐課&#xff0c;之前在C中學習的語法可以有具體的應用場景。Qt的代碼量很大&#xff0c;不要死記硬背&#xff0c;學會查詢文檔的能力更加重要。 建議提升一下相關單詞的儲備量&#xff1a; 1. Qt是什么&#xff1f; Qt是一個基于C語言的圖形用戶界面&a…

React知識框架

一、核心概念 1. 組件化開發 核心思想&#xff1a;將 UI 拆分為獨立、可復用的組件&#xff08;函數組件/類組件&#xff09;。組件特性&#xff1a;props&#xff08;接收參數&#xff09;、state&#xff08;組件狀態&#xff09;、生命周期&#xff08;類組件特有&#xf…

Django之賬號登錄及權限管理

賬號登錄及權限管理 目錄 1.登錄功能 2.退出登錄 3.權限管理 4.代碼展示合集 這篇文章, 會講到如何實現賬號登錄。賬號就是我們上一篇文章寫的賬號管理功能, 就使用那里面已經創建好的賬號。這一次登錄, 我們分為三種角色, 分別是員工, 領導, 管理員。不同的角色, 登錄進去…

[學習]RTKLib詳解:convkml.c、convrnx.c與geoid.c

本文是 RTKLlib詳解 系列文章的一篇&#xff0c;目前該系列文章還在持續總結寫作中&#xff0c;以發表的如下&#xff0c;有興趣的可以翻閱。 [學習] RTKlib詳解&#xff1a;功能、工具與源碼結構解析 [學習]RTKLib詳解&#xff1a;pntpos.c與postpos.c [學習]RTKLib詳解&…

java 破解aspose.words 18.6 使用

資源包&#xff1a;https://download.csdn.net/download/qq_36598111/90787167 jar包是破解過的&#xff0c;直接可以使用。 引入jar&#xff0c;要引入本地的&#xff0c;不要直接引入倉庫的 <dependency><groupId>com.aspose</groupId><artifactId>…

vue使用rules實現表單校驗——校驗用戶名和密碼

編寫校驗規則 常規校驗 const rules {username: [{ required: true, message: 請輸入用戶名, trigger: blur },{ min: 5, max: 16, message: 長度在 5 到 16 個字符, trigger: blur }],password: [{ required: true, message: 請輸入密碼, trigger: blur },{ min: 5, max: 1…

寶塔服務安裝使用的保姆級教程

寶塔介紹&#xff1a; 寶塔面板&#xff08;BT Panel&#xff09; 是一款 國產的服務器運維管理面板&#xff0c;主要用于簡化 Linux/Windows 服務器的網站、數據庫、FTP、防火墻等管理操作。它通過圖形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…

數字化轉型-4A架構之數據架構

4A架構系列文章 數字化轉型-4A架構&#xff08;業務架構、應用架構、數據架構、技術架構&#xff09; 數字化轉型-4A架構之業務架構 數字化轉型-4A架構之應用架構 數字化轉型-4A架構之數據架構 數字化轉型-4A架構之技術架構 數據架構 Data Architecture&#xff08;DA&…

每日腳本 5.11 - 進制轉換和ascii字符

前置知識 python中各個進制的開頭 二進制 &#xff1a; 0b 八進制 &#xff1a; 0o 十六進制 : 0x 進制轉換函數 &#xff1a; bin() 轉為2進制 oct() 轉換為八進制的函數 hex() 轉換為16進制的函數 ascii碼和字符之間的轉換 &#xff1a; chr(97) 碼轉為字符 …

Vulnhub Lazysysadmin靶機攻擊實戰(一)

導語 ??靶機下載地址 https://download.vulnhub.com/lazysysadmin/Lazysysadmin.zip ??靶機信息地址 https://www.vulnhub.com/entry/lazysysadmin-1,205/ 文章目錄 信息收集掃描路徑提權其他思路探索其他方式找密碼總結下載安裝好靶機之后啟動虛擬機如下所示。 信息收集 我…