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

C++ 什么时候应该使用编译器附带的STL以外的STL?,c++,stl,C++,Stl,我对gcc或Visual Studio打包之外的STL实现很好奇,所以快速的Google搜索结果如下: 在什么情况下应该使用替代标准模板库 例如,Apache的页面有一个列表,包括“完全符合C++标准”和“优化编译和非常小的可执行文件大小”等项。如果它这么好,为什么它不能取代libstdc++ 为完整起见,以下是一些其他STL实现: (这是一种特殊用途,适用于无法放入内存的大型数据集) (商业) (GCC的实施) 我从未需要使用替代STL,但我可以设想一些场景,如果您因为为嵌入

我对gcc或Visual Studio打包之外的STL实现很好奇,所以快速的Google搜索结果如下:

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

例如,Apache的页面有一个列表,包括“完全符合C++标准”和“优化编译和非常小的可执行文件大小”等项。如果它这么好,为什么它不能取代libstdc++


为完整起见,以下是一些其他STL实现:

  • (这是一种特殊用途,适用于无法放入内存的大型数据集)
  • (商业)
  • (GCC的实施)

我从未需要使用替代STL,但我可以设想一些场景,如果您因为为嵌入式平台开发而需要小型可执行文件,那么使用Apache版本可能会很有用


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

第三方可以实现STL的改进版本,这些版本尝试提供各种功能,例如更小的大小、更快的执行速度等。您可以选择这些替代实现之一,因为您需要它们实现的其中一个属性。在进行跨平台开发时,您也可以选择其中之一,因为您希望避免在产品的gcc和visualstudio版本之间出现行为差异(仅举一个例子)

如果您有特殊需要,无需等待新版本的带有STL捆绑实现的编译器,就可以获得新的STL实现。

我有时使用的不是Visual Studio附带的STL。当VC6得到支持时,它附带的STL有缺陷,因此使用(或另一个STL)非常有意义(尤其是在构建多线程代码时)


现在更多的是关于性能(大小或速度)。例如,VS2008附带的STL在多线程情况下并不友好,因为它在区域设置对象周围使用了锁定,这会导致您不希望跨线程同步的事情。(参见此处详细说明一个例子).< /P> < P>我们目前使用STLPUT的STL外部实现,因为我们必须使用(由于各种原因)相当旧的微软Visual C++ 6编译器(1998发布日期)和编译器提供的库(Dimkunware)当然已经过时了。

一个原因是为了更好的线程安全性。我当时使用的是Visual Studio(VC6-infact)附带的默认STL,后来不得不改用STLPort,因为它具有更好的线程安全性。

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


这也是测试我所提供的库在其他平台上是否运行良好的第一步。

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


啊,还有。。。看起来Max和我在提到调试时意见一致!;^)~

除了与编译器打包的STL版本外,我从未使用过其他STL版本。但我想到了以下几点

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

    • 有一种他们称之为“power debug mode”的模式,它对“迭代器和容器使用的正确性”进行大量的运行时检查。有助于捕获一些不太明显的错误。在调试和测试时,我强烈建议使用STLPART。

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

      比如说。一些实现者还没有这样做,尽管它在很大程度上减少了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);
      
      向量f;
      向量s;
      size\u t fc=计数(f.begin()、f.end()、SomeValue);
      大小=计数(s.begin()、s.end()、SomeOtherValue);
      
      “旧”实现可以在re中生成两个不同的
      count
      函数