什么是 C 和 C++ 标准库?( 二 )


关于 C++ 标准库,在 OS X Mavericks(V10.9)之前的 Mac 上,libstdc++ 是默认选项 。这在现代的基于 Linux 的系统上可以找到的同样的实现 。自 OS X Mavericks 开始,Apple 切换到使用 libc++,这是 LLVM 项目——Mac 官方编译器框架——所引入的 GNU libstdc++ 标准库的替代 。
IOS 开发者可以使用 iOS SDK(软件开发工具包)来访问标准库,它是一系列允许创建移动应用程序的工具 。
 
windows 版实现
在 Windows 上,标准库的实现一直严格限定在 Visual Studio 中,它是微软官方的编译器 。他们通常称之为 C/C++ 运行时库(CRT),并且它涵盖了 c/c++ 二者的实现 。
在最开始,CRT 被实现为 CRTDLL.DLL 库(我猜,当时没有可用的 C++ 标准库) 。从 Windows 95 开始,Microsoft 开始将其迁移到 MSVCRT [版本号] .DLL(MSVCR20.DLL,MSVCR70.DLL 等)之上,据推测也包含 C++ 标准库 。在 1997 年,他们决定将文件名简化为 MSVCRT.DLL,这不幸导致了令人讨厌的DLL混乱 。这就是为什么从 Visual Studio 7.0 版开始,他们切换回每个版本使用单独的 DLL 了 。
Visual Studio 2015 引入了深度的 CRT 重构 。C/C++ 标准库的实现迁移到一个新库,Universal C 运行时库 (Universal CRT 或 UCRT),编译为 UCRTBASE.DLL 。UCRT 目前已经成为 Windows 组之一,从 Windows 10 开始作为操作系统的一部分提供 。
 
Android 版实现
Bionic 是 google 为其 Android 操作系统所编写的 C 标准库实现,它直接在底层使用 。第三方开发者可以通过 Android 原生开发工具包(NDK)访问 Bionic,该工具集允许你使用 C 和 C++ 代码编写 Android 应用程序 。
在 C++ 端, NDK 提供了很多版本的实现:
● libc++,从从 Lollipop 开始的官方安卓系统和现代 Mac 操作系统都将其作为 C++ 标准库使用 。从 NDK 发布 17 版本开始,它将成为 NDK 中唯一可用的 C++ 标准库实现;
● gnustl,libstdc++ 的别名,这两者在 GNU/linux 是同一个库 。这个库的已被弃用,它将在 NDK 发布 18 中删除;
● STLport,由 STLport 项目编写的 C++ 标准库的第三方实现,自 2008 年以来一直处于不活跃状态 。与 gnustl 一样,STLport 将在 NDK 发布 18 中移除 。
我能使用不同版本的实现代码来替代默认实现吗?
如果你正在使用资源非常有限的系统,则通常需要引用 C 标准库的不同实现 。比如,uClibc-ng, musl libc 和 diet libc 等等,所有这些都适用于嵌入式 Linux 系统的开发,提供更小的二进制文件和更少的内存占用 。
C++ 标准库也有不同的实现版本:Apache C++ 标准库,uSTL 以及 EASTL 等等 。后面两个实际上仅关注模板部分,而不是完整的库,并且他们是在速度优先的情况下开发的 。Apache 版本的库注重的是可移植性 。
 
如果我们脱离了标准库怎么办?
不使用标准库很简单:只要在你的程序中不引入它们的任何一个头文件,你的工作就完成了 。然而,为了让这个操作更有意义一些,你需要通过一些提供的系统调用使用某种方法与操作系统互动 。就像我之前说的,这就是标准库中的函数/方法在底层实现的时候所使用的 。很可能你也会不得不调用这些方法来与硬件设备交互 。
如果对你来说这听起来很让人激动,有些人已经开始在网上尝试在不导入标准库的情况下创建工作流程 。因为你依赖于一个特定操作系统所提供的函数,这种方式会丧失可移植性 。然而通过使用这种艰难的方式,肯会让你学到更多,而且让你更好的理解当你所做的事情,即使是在使用高级库的时候 。
除了知识,当你在嵌入式操作系统上面工作的时候你不会想去引入标准库:因为代码不需要移植,在有限的内存中每个字节都很重要,这会让你更加精准的写代码 。另一个使用背景就是 demoscene,在这里人们尽量有限的程序的二进制大小中去保留高质量的音视频——4K仍然不是最小值:一些 demoparties 使用 1K,256 字节,64 字节或者甚至 32 字节来竞争 。在那里不允许使用标准库!
 

【什么是 C 和 C++ 标准库?】


推荐阅读