C++标准库可移植性

C++ Standard Library Portability

本文关键字:可移植性 标准 C++      更新时间:2023-10-16

我从事大规模、多平台、实时网络应用程序的工作。我从事的项目缺乏对容器或标准库的真正使用,没有智能指针或任何"现代"C++语言功能。许多原始动态分配的数组很常见。

我非常想开始使用标准库和一些 C++11 规范,但是,有很多人也在从事我的项目,因为"STL/C++11 不是那么便携,我们冒险使用它"。我们确实在各种嵌入式系统以及成熟的Ubuntu/Windows/Mac OS系统上运行软件。

那么,对于我的问题;标准库和 C++11 所涉及的可移植性的实际问题是什么?这只是让 g++ 超过某个版本的情况吗?是否有某些平台没有支持?是否需要编译库,如果需要,是否难以获取/编译?有没有人遇到过被非便携式纯C++烧毁的严重问题?

库对新 C++11 标准的支持对于 Visual C++ 2012、gcc>= 4.7 和 Clang>= 3.1 都非常完整,除了一些并发的东西。编译器对所有单个语言功能的支持是另一回事。有关支持的 C++11 功能的最新概述,请参阅此链接。

为了深入分析嵌入式/实时环境中的C++,Scott Meyers 的演示材料非常棒。它讨论了虚拟功能、异常处理和模板的成本等等。特别是,您可能想看看他对堆分配、运行时类型信息和异常等C++特性的分析,这些功能具有不确定的最坏情况计时保证,这对实时系统很重要。

这些问题而不是便携性应该是你主要关心的问题(如果你关心你奶奶的心脏起搏器......

任何C++编译器都应该支持标准库的某个版本。标准库是C++的一部分。不支持它意味着编译器不是C++编译器。如果您目前使用的任何编译器不支持 C++03 标准库,我会感到非常惊讶,所以没有任何借口。当然,编译器必须从 2003 年开始更新,但除非您针对某些仅受古老编译器支持的古老系统进行编译,否则您将没有问题。

至于C++11,目前支持非常好。GCC 和 MSVC 都已经支持 C++11 标准库的大部分。同样,如果您使用的是这些编译器的最新版本,并且它们支持您想要编译的系统,那么您没有理由不能使用它们支持的 C++11 标准库的子集 - 这几乎是全部。

没有标准库的C++就不C++。语言和库功能齐头并进。

有GCC的libstdc++和MSVC 2012支持的C++11库功能列表。我找不到LLVM的libc ++的类似内容,但他们确实有一个clang c ++ 11支持页面。

与您交谈的人混淆了几种不同的问题。 C++11 今天并不是真正的便携式。 我不认为任何编译器 100% 支持它(尽管我可能是错的);您可以侥幸使用其中的大部分,如果(并且仅当)您限制自己到两个或三个平台上的最新编译器(Windows和Linux,可能还有Apple)。 虽然这些是大多数可见的平台,它们只代表所有平台的一小部分机器。 (如果您正在处理大规模联网应用程序,Solaris可能很重要,而Sun CC。除非Sun自从我上次工作以来发生了很大的变化,否则意味着 C++03 中甚至有你无法计数的部分上。

STL是一个完全不同的问题。 部分取决于关于你所说的 STL 是什么意思,但肯定没有今天使用std::vector的可移植性问题。 locale在极少数编译器上可能会出现问题(Sun就是这样CC - 包含 Rogue Wave 和 Stlport 库),和一些算法,但在大多数情况下,你可以几乎都指望C++03。

最后,还有什么选择? 如果你没有 std::vector,你最终实现了几乎一些东西喜欢它。 如果你真的担心 std::vector,把它包装在你自己的类中——如果不是的话可用(极不可能,除非你回去一段时间机器),只需重新实现它,就像我们在试行标准日。

将 STLPort 与现有编译器配合使用(如果它支持)。这只不过是一个代码库,你使用其他库没有问题,对吧?

每个允许的实现定义的行为都列在公开可用的标准草案中。在 C+11 中,没有什么比 C++98 更便携的了。