C++标准库的可移植性

8

我从事大规模、多平台、实时网络应用的开发。我所涉及的项目缺乏对容器或一般标准库、智能指针或任何“现代”C++语言特性的实际使用,使用原始动态分配数组很常见。

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

那么,我的问题是:与标准库和C++11相关的可移植性实际上存在哪些问题?只是需要g++版本达到一定水平吗?是否有一些平台没有支持?是否需要编译库,如果是,是否难以获得/编译?是否有人曾经因为非可移植的C++而遭受严重问题?


1
这实际上取决于嵌入式平台可用的编译器。如果您的代码必须在某些古老的8位平台上运行,而该编译器是在标准化之前编写的,那么您可能会遇到可移植性问题。但是,如果您有任何相对较新的G ++,至少在C ++03方面,您就很安全了。我的经验是,支持这些旧平台变得太痛苦了,而现在的“嵌入式”设备是相当复杂的计算机。 - juanchopanza
4
http://kera.name/articles/2010/08/it-is-not-called-the-stl-mmkay/ - Griwes
您是指代码可移植性还是二进制文件可移植性? - Mooing Duck
2
术语“STL”指的是旧的SGI库,它非常优秀以至于被整合到了C++标准库中。C++11为容器添加了“移动”功能,但并没有太大的变化,主要是一些可移动的重载和使用移动方式绕过复制的新方法。C++11允许实现更高效的容器。 - doug65536
5个回答

3

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

如果想深入分析C++在嵌入式/实时环境中的应用,可以查看Scott Meyers的演示材料。它讨论了虚函数、异常处理和模板等成本以及更多内容。特别是,您可能想查看他对C++特性(如堆分配、运行时类型信息和异常)的分析,这些都具有不确定的最坏时间保证,在实时系统中很重要。

应该关注那些问题而不是可移植性,因为这些问题会影响到重要的方面(如果您关心奶奶的起搏器...)


我认为(我承认我大多数是基于道听途说的)大多数嵌入式系统使用基于g++、clang或EDF前端的编译器。如果是这样,他们在语言特性方面应该没有问题。可移植性问题更可能出现在较大的机器上——Sun CC(用于Solaris)相当落后,我怀疑其他真正专有的编译器也是如此——如果我认为可能不得不移植到大型机,则肯定不会使用auto或lambda。 - James Kanze

3
任何C++编译器都应该支持某个版本的标准库。标准库是C++的一部分。不支持它意味着编译器不是C++编译器。我会非常惊讶,如果你现在使用的任何编译器不支持可移植的C++03标准库,那么就没有借口了。当然,编译器必须已经更新至2003年以后的版本,但除非你正在为某个古老系统编译,而这个系统只能由一个古老的编译器支持,否则你不会遇到任何问题。
至于C++11,在目前情况下支持得相当好。GCC和MSVC都已经支持了大部分的C++11标准库。同样,如果你使用这些编译器的最新版本并且它们支持你想要编译的系统,那么你没有理由不能使用它们支持的C++11标准库子集——几乎所有的标准库特性都被支持了。
没有标准库的C++就不是C++。语言和库特性是相辅相成的。

这里有GCC's libstdc++MSVC 2012支持的C++11库特性列表。我找不到类似的东西适用于LLVM的libc++,但是他们有一个clang c++11 support page


那个VS C++0x的状态已经过时了。 - Puppy
@DeadMG教我不要检查我的来源。 - Joseph Mansfield

3
你正在与对方讨论几个不同的问题。目前C++11并不是真正的跨平台,我认为没有任何编译器能够完全支持它(虽然我可能错了);如果你限制自己只使用最近的两到三个平台上最新的编译器(Windows和Linux,以及可能的苹果系统),则可以使用大部分C++11。尽管这些平台最为常见,但它们只代表所有机器中的一小部分。(如果你在开发大型网络应用程序,则Solaris可能很重要,并且需要用Sun CC编译器。除非自从我最后一次使用它以来Sun有了很大的改变,否则甚至连C++03的某些部分都不能保证)
STL是一个完全不同的问题。部分取决于你所说的STL是什么,但现在使用std::vector没有任何可移植性问题。locale 在极少数的编译器上可能会有问题(例如在使用Rogue Wave和Stlport库时的Sun CC),一些算法也存在问题,但大多数情况下你可以相当确信使用所有C++03的内容。
最终,还有哪些选择呢?如果没有std::vector,你最终会实现一个与它非常相似的东西。如果你真的担心std::vector的存在,可以将其包装在自己的类中 - 如果它不可用(除非你使用时光机回到以前的年代),则只需按照预先标准化的方式重新实现即可。

0

如果你的编译器支持,可以使用STLPort。这只是一个代码库,你也可以毫无问题地使用其他库,对吧?


0

每个允许的实现定义行为都列在公开可用的标准草案中。在C++11中,比C++98更少的内容是不可移植的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接