深入浅出之STL源码分析2_stl与标准库,编译器的关系
引言在第一篇博客中深入浅出之STL源码分析1_vector基本操作-CSDN博客我们将引出下面的几个问题1.刚才我提到了我的编译器版本是g 11.4.0而我们要讲解的是STL标准模板库那么二者之间的关系是什么以及标准库和标准模版库之间的关系又是什么STL安装后我们到哪里去看源码2.我们引入了头文件#includevector这里的vector的内容是什么3.vectorint test_vector; 这中定义方式是干什么的作用是什么4.test_vector.push_back(22); 对于stl源码底层到底做了什么把对应的数据插入到了哪个地址了什么时候分配的虚拟内存什么时候扩容什么时候会分配物理内存下面我们来重点来说明下问题1.stl和标准库的关系标准库的代码都统一在一个命名空间stdStandard的缩写中也就是说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?libstdc包含 STL 头文件随同 GCC 工具链一起安装但它独立于 gcc 编译器本体是配套的 C 标准库实现。 很多人会误以为标准库是 gcc 程序里面的代码其实是配套组件​安装 GCC会同时安装其标准库libstdc的 ​头文件.h/.hpp​​ 和 ​预编译二进制库.so​。​头文件路径如 /usr/include/c/11/vectorGCC 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::mallocC 标准库函数如printf的实现需要预编译。标准库源码和 glibc 的区别和关系1. libstdc 和 glibc 的区别​​这是两个完全不同的库​​​​libstdc.so​​这是 ​​GNU C 标准库​​包含 C 标准库的实现如std::vector,std::string,iostream等glibc​​这是 ​​GNU C 标准库​​包含 C 标准库的实现如printf,malloc,strlen等​​关系​​你的程序通常会同时链接这两个库C 程序会使用 libstdc而 libstdc 内部可能会调用 glibc 的函数2. 下载 libstdc 源码可以从官网下载源码# 下载 GCC 11.x.x 完整源码 wget https://ftp.gnu.org/gnu/gcc/gcc-11.4.0/gcc-11.4.0.tar.xz3.源码的目录结构gcc-11.4.0/├── libstdc-v3/│ ├── include/ # 标准头文件如 vector, string 的定义│ ├── src/ # 实现文件│ ├── libsupc/ # 支持代码异常处理、RTTI等│ └── testsuite/ # 测试用例├── libgcc/ # GCC 运行时库└── gcc/ # GCC 编译器本身这里有c编译器gcc,也有c编译器g4.GCC、g 和 libstdc 的关系GCC (GNU Compiler Collection)全称​​GNU Compiler Collection本质​​不是一个单一程序而是一个​​编译器套件包含组件​​C 编译器 (gcc)C 编译器 (g),还有其他程序的编译器。一般小写的gcc我们理解成c编译器大写的GCC 就是编译器套件。g 的本质定位​​GCC 套件中的 C 前端实现方式​​在大多数系统中g实际上是一个指向gcc的符号链接当以g名称调用时gcc会自动添加 C 特定的编译选项主要区别默认链接 C 标准库 (libstdc)默认使用 C 语法规则自动识别.cpp等 C 文件扩展名g,libstdc都是GCC的组成部分。5.GNU 项目都包括哪些东西GNU项目GNUs Not Unix ├─ GCCGNU Compiler Collection │ ├─ gcc/g 编译器前端 │ ├─ libgcc 【编译器底层运行支持库】 │ └─ libstdc-v3C标准库源码 ├─ binutils │ └─ /usr/bin/ld as ar readelf ... ├─ glibcGNU C标准库独立项目 │ ├─ shturl. │ ├─ libdl.so-ldl │ └─ ld-linux.so └─ 其他GNU工具6.-ldl、ld、ld-linux.so关系总结ld/usr/bin/ld归属binutilsGNU 二进制工具集编译期链接器。 作用g/gcc 编译完成生成.o目标文件后gcc 驱动调用ld完成链接解析-lxxx参数记录可执行文件对共享库的依赖。-ldl是传给ld的链接参数含义链接libdl.so库libdl.so属于glibc提供dlopen/dlsym等运行时手动加载动态库的 API。注意不是链接器是一个库。ld-linux.so如 ld-linux-x86-64.so.2归属glibcGNU C 标准库运行时动态链接器。 作用程序启动后由内核唤起读取可执行文件中记录的库依赖查询ld.so.cache自动加载.solibstdc.so、shturl.、libdl.so 等。一句话串起来 编译时ldbinutils收到-ldl标记程序依赖libdl.so程序运行时ld-linux.soglibc负责加载libdl.so。

相关新闻

考勤管理系统源码:JSP+Servlet+MySQL实战解析

考勤管理系统源码:JSP+Servlet+MySQL实战解析

简介:面向中小型团队与高校实训场景的 Java 考勤管理系统完整源码包,适合具备 Java Web 基础、希望掌握 Spring 风格业务开发或毕业设计复用的学习者。包内按业务模块划分,覆盖员工管理、考勤打卡、请假/会议申请、固定资产与任务调度等常见功…

2026/10/12 1:24:45 阅读更多 →
用 p5.js 复刻经典扫雷游戏:Minesweeper Coding Challenge 71 源码级实战解析

用 p5.js 复刻经典扫雷游戏:Minesweeper Coding Challenge 71 源码级实战解析

教程文档示例工程 【免费下载链接】website-archive Archive of the Coding Train website (first version) 项目地址: https://gitcode.com/gh_mirrors/we/website-archive 点击查看 免费下载 导读 本文基于 Coding Train(The Coding Train&#xff0…

2026/10/12 1:23:45 阅读更多 →
用 Git 版本控制管理架构决策记录(ADR):从 mkdir 到 Commit 的完整实战

用 Git 版本控制管理架构决策记录(ADR):从 mkdir 到 Commit 的完整实战

【免费下载链接】architecture-decision-record Architecture decision record (ADR) examples for software planning, IT leadership, and template documentation 项目地址: https://gitcode.com/gh_mirrors/ar/architecture-decision-record 点击查看 免费下载 …

2026/10/12 1:23:45 阅读更多 →

最新新闻

嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →
共享Buffer却带宽没降?DDR流量的五大根因与排查实战

共享Buffer却带宽没降?DDR流量的五大根因与排查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →
OTFS信道估计实战:压缩感知与相位旋转在高速移动通信中的应用

OTFS信道估计实战:压缩感知与相位旋转在高速移动通信中的应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →
Qt5.9 C++开发指南章节代码实战:从环境搭建到工程避坑

Qt5.9 C++开发指南章节代码实战:从环境搭建到工程避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →
Linux进程虚拟地址空间:从页表映射到段错误排查

Linux进程虚拟地址空间:从页表映射到段错误排查

搞Linux服务端开发的人,迟早会遇到这么一幕:程序跑着跑着突然Segmentation Fault,或者free的时候报double free,又或者top里看到某个进程的VIRT高得离谱,但RES却很低。很多人第一反应是查代码、查日志,但真…

2026/10/12 2:53:39 阅读更多 →
ESP32 上实现 ONVIF 相机:从组件搭建到 NVR 添加实战

ESP32 上实现 ONVIF 相机:从组件搭建到 NVR 添加实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:52:39 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →