C ++标准库如何在后台工作?

时间:2020-05-18 01:22:15

标签: c++ c++-standard-library

在过去的几天里,这个问题一直困扰着我。我想知道标准库在功能方面如何工作。即使在检查LLVM编译器提供的source code的情况下,我也找不到任何答案,对于我这样的初学者来说,这是一段非常复杂的代码。

我在这里基本上想了解的是C ++标准库如何工作。例如,让我们来看看fstream头文件,它包含一堆有助于写入和读取文件的函数。

它如何工作?它是否使用操作系统特定的API(因为该库是跨平台的),还是什么?而且,如果标准库可以做到这一点,我是否还应该不调用标准fstream文件就无法弄乱某些文件(根据我的经验,我不能这样做)?

如果我不是母语为英语的人,如果我的问题不清楚,我深表歉意:随时修改此文本以使其更清楚。

4 个答案:

答案 0 :(得分:3)

它是否使用特定于操作系统的API(因为该库是跨平台的),还是什么?

在某些时候,使用了特定于操作系统的API。 fstream实现不一定直接调用OS函数。它可能使用其他类,这些类调用从C等继承的函数,但最终,调用链将导致OS调用。 (是的,对于中级程序员而言,细节通常太复杂了。因此,作为一个自称初学者的人,您的发现不足为奇。)

就您而言(C ++程序员)而言,该库是跨平台的,而与平台无关,接口是相同的。但是,它不是每个平台上都相同的库。每个平台都有其自己的库,在C ++端公开相同的接口,但使用不同的OS调用。 (实际上,同一平台可能具有多个标准库,因为库的实现是由您的工具链提供的,而不是由标准委员会提供的。)

而且,如果标准库可以做到这一点,我是否应该不调用标准fstream文件就无法弄乱某些文件(根据我的经验,我不能这样做)?

是的,您被允许。显然,您还没有能力,但是通过一些实践和指导,您应该可以。可以使用您自己的代码重新创建标准库中的所有内容。标准库(以及大多数库)的目的是节省您的时间,而不是启用原本不可用的功能。例如,您不必为编写的每个程序都实现文件流。它在标准库中,因此您可以专注于项目中更有趣的方面。

答案 1 :(得分:2)

从某种意义上说,标准库是跨平台的,因为它的界面在平台之间不会改变,但是其实现会发生变化(或者实际上),如果您仅使用C ++及其标准库,则可以使用相同的方式编写代码 Linux / Windows / MacOS / Android / 任何,以及是否找到C ++那些支持您使用的语言功能的平台之一的编译器,您将能够在不重写任何内容的情况下为该平台编译代码。

因此,尽管您可以独立于要编写的平台使用std::vectorstd::fstream或库中的任何其他功能,并且期望函数定义,类型名称等看起来相同,则不能期望为Windows 10的PC编译的可执行文件可以在具有Android的手机上运行。您甚至不能期望同一可执行文件在同一台PC上但在不同的系统上运行-这就是我所说的“实现方式不同”

造成这种差异的主要原因有两个:

  1. 具有不同体系结构(例如x86-64和ARM)的处理器使用不同的指令集,因此C ++源代码需要编译为完全不同的机器代码才能正常运行
  2. 具有相同体系结构的处理器且具有不同操作系统的计算机具有动态分配内存,创建文件,创建流,写入控制台,创建和调度线程等的不同方式-这是您系统功能的一部分通过标准库使用

如果您确实想要,可以使用HeapAlloc()代替operator new()CreateThread()代替stdlib的std::thread,但这将迫使您每次都重写程序希望将其编译为Windows以外的其他版本,然后使用目标平台的编译器重新编译(并通过代理了解其API)。标准库通过抽象出那些系统调用来避免麻烦。

特别是对于fstreamhere是当今大多数PC内部使用的。

答案 2 :(得分:1)

编译器只是一个创建可执行文件或库的程序。您可以使用编译器的默认库来获取时间或编写自己的库。默认库与os通信以进行文件操作或内存分配,并提供一个简单的标准类,以允许开发人员仅编写一个代码,该代码可在编译器和库支持的所有目标平台上工作。如果要编写自己的代码,则必须为所有目标操作系统编写每个函数。

答案 3 :(得分:1)

基本上,fstreamiostreamprintf基于内核函数write()工作。当您的代码调用printf(我们以printf为例)时,它将最终调用write(),以使内核在IO上工作。之后,write()返回,printf返回,您的代码继续。

因此,如果您真的想知道printf在内部的工作方式,则必须阅读内核的源代码。

但是您暂时不应该这样做。

对于初学者,如果您对计算机没有基本的了解,请不要尝试更深入。计算机就像建筑物一样,是一个项目。因此正确的学习方法是逐级学习。首先,学习如何使用砖和水泥建造建筑物,这是您现在应该做的。您不应该做的是正在学习如何建造建筑物,这是您第一次尝试使用砖块,然后您对如何生产砖块并开始关注砖块感兴趣,这是错误的方法学习它。

如果您正在学习C / C ++,请学习它。记住,逐级学习。现在,知道如何使用printf就足够了。