我对使用gcc或Visual Studio打包的STL实现感到好奇,因此快速的Google搜索结果显示了一些结果,例如:
在什么情况下应该使用替代标准模板库?
例如,Apache的页面有一个列表,其中包括“完全符合C ++标准”和“针对快速编译和极小的可执行文件大小进行优化”等项目。如果它很好,为什么不能取代libstdc ++?
<小时/> 为了完整起见,以下是一些其他STL实现:
答案 0 :(得分:13)
我从来没有使用过编译器之外的STL版本。但是我想到了一些观点。
basic_string
实现,而编译器附带的STL版本不提供此功能。 hash_map
(及相关)版本与hash_map
的{{1}}(以及相关)有明显不同的设计。答案 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的改进版本,尝试提供各种各样的东西,例如更小的尺寸,更快的执行等。您可以选择其中一种替代实现,因为您需要其实现的其中一个属性。您也可以在进行跨平台开发时选择其中一个,因为您希望避免遇到产品的gcc和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()
答案 12 :(得分:0)
MSVC ++和GNU g ++都有很好的C ++标准库实现,但有些编译器没有,如果我不得不支持这样的编译器,我会寻找STL的第三方实现。