深入浅出之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.mzph.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/ 文章目录 信息收集扫描路径提权其他思路探索其他方式找密码总结下载安装好靶机之后启动虚拟机如下所示。 信息收集 我…