深入浅出之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 )的实现需要预编译。 |

相关推荐
码匠许师傅5 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
ShineWinsu6 小时前
对于 C++:C++14中从变量模板、泛型 Lambda 到并发与字面量的解析
c++·算法
一木 之林8 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
程与留8 小时前
07_QMainWindow 与应用程序框架——菜单栏、工具栏、状态栏
c++·qt
_Narcissus_10 小时前
二分算法笔记及例题
数据结构·c++·笔记·算法·蓝桥杯·查找·二分算法
青少儿编程课堂12 小时前
用图形化编程做一个“少年探险闯关”小游戏:方向键控制、碰撞检测与多关卡串起完整项目
c++·python·算法·bfs·信息学竞赛
liulilittle12 小时前
长上下文的成本结构与「甜点区间」——从推理引擎的物理约束看 200K/256K/400K
c++·人工智能·ai·llm·注意力·qkv
十五年专注C++开发12 小时前
100w条数据丝滑滚动!Qt Model/View 架构实战(二)
开发语言·c++·qt
skr爱码士13 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
开发语言·c++·qt
奶茶树13 小时前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github