basic_ios及其衍生库(附 GCC libstdc++源代码)

ops/2024/12/26 22:27:55/

basic_ios及其衍生库(附 GCC libstdc++源代码)

我们由这张图展开我们的讨论

在这里插入图片描述

对于Date对象,只有实现了<<重载到输出流才可以插入到stringstream ss中
现在我有疑问stringstream是怎么做到既能输出又能输入的?
而且为什么stringstream对象能传给ostream对象的引用?
在这里插入图片描述
在这里插入图片描述
我们可以知道ostream是ostringstream的基类,由于父类引用能够接收子类对象,所以只要我们实现了自定义类型的operator<<,无论是ostream对象还是stringstream对象,我们都能够实现自定义类型的输出
在这里插入图片描述

下面我们将对ostream库,streambuf库,ofstream库,filebuf库,ostringstream库以及stringbuf库的源代码进行刨析,相信通过下面的讲解,你一定能够对c++的io有更深入的了解
两大收获:

  1. 理解了为什么cout比printf效率慢(因为printf是对系统调用的直接封装,而cout是更加上层的封装)
  2. 通过c++底层库对c语言struct FILE的封装,了解c++是在提出面向对象之后,对c语言的封装,这点将在filebuf库中提到。
    在这里插入图片描述
    cout本身就比printf效率慢,又因为流同步机制的存在,所以我们需要对std::cout进行优化
    流同步是指 C++ 的标准流(如 std::cout)和 C 的标准流(如 printf)之间的缓冲区同步机制。它的目的是确保在同一个程序中同时使用 C 和 C++ 的输入输出函数时,数据能够按照预期顺序输出,不会发生混乱
    注意:禁用同步后,若混用 std::cout 和 printf,输出顺序可能会出现问题。
#include <iostream>
#include <cstdio>int main() {std::ios::sync_with_stdio(false); // 禁用同步std::cout << "C++ Output";printf("C Output");return 0;
}

输出可能是:
在这里插入图片描述
在这里插入图片描述

libstdc++库

lbstdc++库通常都不会将一个类全部实现在一个文件中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模板实例化分为两种

  1. 隐式实例化(默认行为)(即普通模板实例化,如ostream.tcc)
    如果模板定义在头文件中,并被多个源文件包含,每个源文件都会为需要的类型生成模板实例化代码
    编译阶段:每个编译单元都会实例化模板。
    链接阶段:链接器会去重,最终保留一份实例化代码。
    缺点:编译时间较长,每个编译单元都要实例化同一模板。
  2. 显示模板实例化(如ostream-inst.cc)
    在一个源文件中,显式告诉编译器为某个类型生成模板实例化代码,其他编译单元不再需要实例化该模板类型。避免每个编译单元重复实例化同一模板类型。
    提高编译速度。
    解决模板在不同编译单元中重复实例化的问题。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源代码网站https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/libstdc%2B%2B-api-4.5/a00902.html

期待下次再见,由于精力受限,只对ostream库及其衍生库做解释,istream和iostream库实现类似


http://www.ppmy.cn/ops/145225.html

相关文章

MR-GDINO: Efficient Open-World Continual Object Detection

摘要 开放世界&#xff08;OW&#xff09;识别与检测模型展现出了强大的零样本和少样本适应能力&#xff0c;这启发了人们将其作为初始化方法应用于持续学习方法中以提高性能。尽管在已见类别上取得了令人鼓舞的结果&#xff0c;但由于灾难性遗忘&#xff0c;这些模型在未见类…

iOS 多个输入框弹出键盘处理

开发中遇到这样一个场景&#xff0c;有多个输入框 而不同的输入框&#xff0c;需要页面向上偏移的距离不一样 这个时候&#xff0c;需要我们在获取到键盘弹出通知的时候&#xff0c;需要 知道我们开始进行编辑的是哪一个输入框&#xff0c;这个时候 需要我们知道一个技术点&…

2024.12 迈向可解释和可解释的多模态大型语言模型:一项综合调查

https://arxiv.org/pdf/2412.02104 问题 随着多模态大语言模型&#xff08;MLLMs&#xff09;在人工智能领域的快速发展&#xff0c;其在处理多模态信息&#xff08;如文本、图像、视频、音频&#xff09;时展现出强大的能力&#xff0c;但模型的复杂性和规模导致其决策过程难…

mysql系列5—Innodb的缓存

背景 建议读者站在设计者的角度&#xff0c;思考如何设计InnoDB缓存 以[mysql系列3—mysql索引图解]中的聚簇索引为例, 查询主键为33的记录: [1] 加载聚簇索引根节点所在的数据页&#xff1b; [2] 使用33与目录(21, 35)依次进行比较&#xff0c;得到子节点信息(地址、表空间、…

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…

Charles安装证书过程(手机)

背景&#xff1a;使用模拟器抓包时&#xff0c;发现https请求无法抓取&#xff0c;需要安装相应证书。我自己是因为模拟器升级了安卓7&#xff0c;发现之前安装的证书无效了&#xff0c;需要重新安装。 参考博客&#xff1a;夜神模拟器12Charles进行Https抓包_模拟器抓包ssl-C…

从CreateDialogIndirectParam起---我与大模型对话

前言&#xff1a; 对当前的大模型来说&#xff0c;一切皆程序&#xff0c;皆标准。只能按照推定的线路行走&#xff0c;就像机器人走进死胡同&#xff0c;不停的踏步也不回头。除非人为去干预它。其实我提出的这个问题前是因为我不清楚了解一部分WinAPI有着严格的检查机制和自毁…

实战OpenCV之物体跟踪

基础入门 物体跟踪技术是一种计算机视觉领域的重要技术,用于连续地检测和定位视频序列中的一个或多个目标物体。物体跟踪技术在众多领域都有广泛的应用,比如:自动驾驶、安防监控、增强现实等。物体跟踪的基本流程包含以下几个主要步骤。 1、初始化:确定跟踪的目标物体及其初…