8

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

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

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

4

5 回答 5

3

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

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

你主要关心的是这类问题而不是便携性(如果你关心你奶奶的起搏器......)

于 2013-01-28T20:50:24.750 回答
3

任何 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 支持页面

于 2013-01-28T20:56:35.423 回答
3

您正在与之交谈的人混淆了几个不同的问题。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.天。

于 2013-01-28T21:55:02.133 回答
0

STLPort与您现有的编译器一起使用,如果它支持的话。这只不过是一个代码库,你使用其他库没有问题,对吧?

于 2013-01-28T22:00:01.717 回答
0

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

于 2017-04-18T12:37:04.753 回答