在过去的几天里,这个问题一直困扰着我。我想知道标准库在功能方面如何工作。即使在检查LLVM编译器提供的source code的情况下,我也找不到任何答案,对于我这样的初学者来说,这是一段非常复杂的代码。
我在这里基本上想了解的是C ++标准库如何工作。例如,让我们来看看fstream
头文件,它包含一堆有助于写入和读取文件的函数。
它如何工作?它是否使用操作系统特定的API(因为该库是跨平台的),还是什么?而且,如果标准库可以做到这一点,我是否还应该不调用标准fstream
文件就无法弄乱某些文件(根据我的经验,我不能这样做)?
如果我不是母语为英语的人,如果我的问题不清楚,我深表歉意:随时修改此文本以使其更清楚。
答案 0 :(得分:3)
它是否使用特定于操作系统的API(因为该库是跨平台的),还是什么?
在某些时候,使用了特定于操作系统的API。 fstream
实现不一定直接调用OS函数。它可能使用其他类,这些类调用从C等继承的函数,但最终,调用链将导致OS调用。 (是的,对于中级程序员而言,细节通常太复杂了。因此,作为一个自称初学者的人,您的发现不足为奇。)
就您而言(C ++程序员)而言,该库是跨平台的,而与平台无关,接口是相同的。但是,它不是每个平台上都相同的库。每个平台都有其自己的库,在C ++端公开相同的接口,但使用不同的OS调用。 (实际上,同一平台可能具有多个标准库,因为库的实现是由您的工具链提供的,而不是由标准委员会提供的。)
而且,如果标准库可以做到这一点,我是否应该不调用标准
fstream
文件就无法弄乱某些文件(根据我的经验,我不能这样做)?
是的,您被允许。显然,您还没有能力,但是通过一些实践和指导,您应该可以。可以使用您自己的代码重新创建标准库中的所有内容。标准库(以及大多数库)的目的是节省您的时间,而不是启用原本不可用的功能。例如,您不必为编写的每个程序都实现文件流。它在标准库中,因此您可以专注于项目中更有趣的方面。
答案 1 :(得分:2)
从某种意义上说,标准库是跨平台的,因为它的界面在平台之间不会改变,但是其实现会发生变化(或者实际上),如果您仅使用C ++及其标准库,则可以使用相同的方式编写代码 Linux / Windows / MacOS / Android / 任何,以及是否找到C ++那些支持您使用的语言功能的平台之一的编译器,您将能够在不重写任何内容的情况下为该平台编译代码。
因此,尽管您可以独立于要编写的平台使用std::vector
或std::fstream
或库中的任何其他功能,并且期望函数定义,类型名称等看起来相同,则不能期望为Windows 10的PC编译的可执行文件可以在具有Android的手机上运行。您甚至不能期望同一可执行文件在同一台PC上但在不同的系统上运行-这就是我所说的“实现方式不同”
造成这种差异的主要原因有两个:
如果您确实想要,可以使用HeapAlloc()
代替operator new()
或CreateThread()
代替stdlib的std::thread
,但这将迫使您每次都重写程序希望将其编译为Windows以外的其他版本,然后使用目标平台的编译器重新编译(并通过代理了解其API)。标准库通过抽象出那些系统调用来避免麻烦。
特别是对于fstream
,here是当今大多数PC内部使用的。
答案 2 :(得分:1)
编译器只是一个创建可执行文件或库的程序。您可以使用编译器的默认库来获取时间或编写自己的库。默认库与os通信以进行文件操作或内存分配,并提供一个简单的标准类,以允许开发人员仅编写一个代码,该代码可在编译器和库支持的所有目标平台上工作。如果要编写自己的代码,则必须为所有目标操作系统编写每个函数。
答案 3 :(得分:1)
基本上,fstream
,iostream
和printf
基于内核函数write()
工作。当您的代码调用printf
(我们以printf
为例)时,它将最终调用write()
,以使内核在IO上工作。之后,write()
返回,printf
返回,您的代码继续。
因此,如果您真的想知道printf
在内部的工作方式,则必须阅读内核的源代码。
但是您暂时不应该这样做。
对于初学者,如果您对计算机没有基本的了解,请不要尝试更深入。计算机就像建筑物一样,是一个项目。因此正确的学习方法是逐级学习。首先,学习如何使用砖和水泥建造建筑物,这是您现在应该做的。您不应该做的是正在学习如何建造建筑物,这是您第一次尝试使用砖块,然后您对如何生产砖块并开始关注砖块感兴趣,这是错误的方法学习它。
如果您正在学习C / C ++,请学习它。记住,逐级学习。现在,知道如何使用printf
就足够了。