什么时候应该使用编译器附带的STL以外的STL?

时间:2009-11-10 17:26:59

标签: c++ stl

我对使用gcc或Visual Studio打包的STL实现感到好奇,因此快速的Google搜索结果显示了一些结果,例如:

在什么情况下应该使用替代标准模板库?

例如,Apache的页面有一个列表,其中包括“完全符合C ++标准”和“针对快速编译和极小的可执行文件大小进行优化”等项目。如果它很好,为什么不能取代libstdc ++?

<小时/> 为了完整起见,以下是一些其他STL实现:

13 个答案:

答案 0 :(得分:13)

我从来没有使用过编译器之外的STL版本。但是我想到了一些观点。

  • 线程安全性:来自apache的STL提供了一个编译开关来打开/关闭一些线程安全功能。
  • 本地化:来自apache的STL再次为许多不同的语言环境提供了很好的支持。
  • 数据结构:您可能需要基于COW(写时复制)的basic_string实现,而编译器附带的STL版本不提供此功能。
  • 非标准扩展程序:您喜欢其他一些STL实现的特定功能。例如,Dinkumware(与Visual Studio一起提供)的hash_map(及相关)版本与hash_map的{​​{1}}(以及相关)有明显不同的设计。
  • 二进制问题:由于代码大小,在某些环境(嵌入式软件)中存在约束。在这种情况下,如果您不需要整个STL,那么使用简化版本会很有趣。
  • 性能:如果您在分析后发现“其他”STL实现为特定应用程序提供了显着更好的性能,那该怎么办呢? (有很多关于算法和数据结构的细节,这实际上是可能的。)
  • 调试模式:某些STL实现提供了很好的调试功能。例如,检查迭代器的范围。

答案 1 :(得分:10)

我有时使用STLPort而不是Visual Studio附带的STL。当支持VC6时,它附带的STL是错误的,所以使用STLPort(或其他STL)很有意义(特别是如果你正在构建多线程代码)。

现在通常更多的是性能(尺寸或速度)。例如,VS2008附带的STL在多线程情况下并不友好,因为它使用区域设置对象锁定,导致您不希望跨线程同步的事情。 (有关此示例的详细信息,请参阅此处Convert a number to a string with specified length in C++。)

答案 2 :(得分:3)

我从来没有需要使用替代STL,但我可以设想一些可能有用的场景,例如Apache版本,如果你需要小型可执行文件,因为你正在为嵌入式开发平台。

另一个原因可能是使用STL版本来保证标准不一定保证的某些事情。例如,要确保您具有非COW字符串,以便可以编写线程安全的代码。

答案 3 :(得分:3)

第三方可以实现STL的改进版本,尝试提供各种各样的东西,例如更小的尺寸,更快的执行等。您可以选择其中一种替代实现,因为您需要其实现的其中一个属性。您也可以在进行跨平台开发时选择其中一个,因为您希望避免遇到产品的g​​cc和Visual Studio版本之间的行为差​​异(仅作为一个示例)。

如果您有特定需求,则无需等待带有捆绑STL实现的编译器的新版本,以便在需要时重新实现它。

答案 4 :(得分:3)

STLport具有他们所谓的“电源调试模式”,可以对“迭代器和容器使用的正确性”进行大量的运行时检查。帮助捕获一些不会立即显现的错误。我强烈建议在调试和测试时使用STLport。

答案 5 :(得分:3)

C ++标准库可以通过多种方式实现。一些实施者试图应对现代思想。因此,使用优化的实现可能会导致更快,更小的可执行文件。

SCARY为例。一些实施者还没有这样做,尽管它在很大程度上减少了STL的膨胀。执行以下操作时:

vector<int> f;
vector<int, MyAllocator> s;

size_t fc = count(f.begin(), f.end(), SomeValue);
size_t sc = count(s.begin(), s.end(), SomeOtherValue);

“旧”实现可能会在结果可执行文件中生成两个不同的count函数,因为f的类型与s的类型不同。这是因为迭代器类型取决于向量本身的类型,尽管它不需要那样。更好的想法是在单独的类中分离迭代器的类型,并在typedef中提供vector,编译器只生成一个count。这只是一个例子,但我认为还有更多关于某些实现的质量的说法。

答案 6 :(得分:2)

除了已经给出的原因之外,我可以想象由于debugging support使用不同的STL或者作为保证我不依赖于供应商扩展的方式。

这也是测试我运送的图书馆是否在其他平台上运行良好的第一步。

答案 7 :(得分:2)

提到STLport的人提到了性能和可移植性,但也提供了很好的debug mode。我认为如果您当前的编译器库以这种方式受限,那么使用不同的STL是一个很好的理由。

Aaand ......看起来Max和我并没有提到调试! ; ^)〜

答案 8 :(得分:1)

我们目前正在使用STLPort - STL的外部实现,因为我们必须使用(由于各种原因)相当旧的Microsoft Visual C ++ 6.0编译器(1998年发布日期)和编译器提供的库(由Dimkunware提供)当然是非常过时的

答案 9 :(得分:1)

一个原因是更好的线程安全性。我使用Visual Studio附带的默认STL(VC6 infact)然后不得不转移到STLPort,因为它具有更好的线程安全性。

答案 10 :(得分:1)

在开启额外诊断信息的能力方面,一些人已经提到了调试,但另一个重要方面是如果你使用平台自己的STL,那么你可以在调试器中获得更好的体验。如果您使用的Visual Studio具有适用于所有标准容器的可视化工具,则尤其如此。

答案 11 :(得分:1)

STLPort通过std :: fstreams支持大于2GB的文件。 Visual Studio 2005/2008无法处理大于2GB的文件。

您可以通过显示:std::numeric_limits<std::streamsize>::max()

来测试您的STL实施

答案 12 :(得分:0)

MSVC ++和GNU g ++都有很好的C ++标准库实现,但有些编译器没有,如果我不得不支持这样的编译器,我会寻找STL的第三方实现。