tags:

views:

700

answers:

13

I was curious about STL implementations outside of what's packaged with gcc or Visual Studio, so a quick Google search turned up a few results, such as:

Under what circumstances should one use an alternative standard template library?

For instance, Apache's page has a list including items such as "full conformance to the C++ standard" and "optimized for fast compiles and extremely small executable file sizes". If it's so good, why wouldn't it replace libstdc++?


For the sake of completeness, here are some of the other STL implementations:

+3  A: 

I've never had a need to use an alternative STL, but I could envision some scenarios where it might be useful to use, for example, the Apache version, if you need small executables because you're developing for an embedded platform.

Another reason might be to use an STL version that guarantees certain things which are not necessarily guaranteed by the standard. For example, to ensure you have non-COW strings so you can write thread-safe code.

Charles Salvia
+3  A: 

Third parties can implement improved versions of STL that attempt to offer various things, such as smaller size, faster execution, etc. You might choose one of these alternative implementations because you want one of those attributes of their implementation. You might also choose one of them when doing cross-platform development because you want to avoid running into differences in behavior between the gcc and Visual Studio versions of your product (as just one example).

There is no need to wait for a new release of a compiler with a bundled implementation of STL in order to reach out for a fresh implementation of it if you have specific needs.

Clay Fowler
+9  A: 

I sometimes use STLPort rather than the STL that ships with Visual Studio. Back when VC6 was supported the STL that shipped with it was buggy and so using STLPort (or another STL) made a lot of sense (especially if you were building multi-threaded code).

Now it's often more about performance (size or speed). For example, the STL that ships with VS2008 isn't that friendly in a multi-threaded situation as it uses locking around locale objects which causes things that you wouldn't expect to synchronise across threads. (See here http://stackoverflow.com/questions/225362/convert-a-number-to-a-string-with-specified-length-in-c/226719#226719 for details of one example of this).

Len Holgate
+1  A: 

We are currently using STLPort - external implementation of STL because we have to use (for various reasons) quite old Microsoft Visual C++ 6.0 compiler (1998 release date) and compiler supplied library (by Dimkunware) is of course very out of date.

Aleksei Potov
Visual C++ 6.0 was released in 1998 but you are correct about the compiler-supplied library being very substandard. Doesn't help that the C++ compiler itself fails to support significant aspects of the C++ standard, aspects that make template metaprogramming rather difficult.
ChrisInEdmonton
thanks, updated. that typo worth of decade :)
Aleksei Potov
+1  A: 

One reason is for better thread-safety. I was using the default STL that came with Visual Studio (VC6 infact) then had to shift to STLPort as it had much better thread-safety.

Naveen
+2  A: 

Aside from the reasons already given, I could imagine using a different STL due to debugging support or as a way to guarantee I was not relying on vendor extensions.

It would also be a first step in testing whether a library I was shipping worked well on other platforms.

Max Lybbert
+1 for portability - working on other library implementations is a necessary but not sufficient condition for working on other compilers.
Steve Jessop
Yes, necessary but not sufficient.
Max Lybbert
+2  A: 

Folks mentioning STLport have cited performance and portability, but there's also a pretty good debug mode available. I think that's a great reason to be using a different STL, if your current compiler's library is limited in this way.

Aaand ... it looks like Max and I tied on mentioning debugging! ;^)~

Don Wakefield
+11  A: 

I never had to use an STL version other than the one packed with the compiler. But here are some points that come into my mind.

  • Thread-safety: The STL from apache provides a compile switch to turn on/off some thread-safety features.
  • Localization: Again the STL from apache comes with nice support for many different locales.
  • Data structures: You might need a basic_string implementation that is based on COW (copy-on-write) and the STL version that came with your compiler doesn't offer that.
  • Non-standard extensions: Particular features you like from some other STL implementations. For example, hash_map (and related) versions from Dinkumware (which ships with Visual Studio) have a significantly different design from hash_map (and related) from STLPort.
  • Binary issues: Constraints in some environment (embedded software) due to code size. In such case, if you don't need the whole STL it could be interesting to use a reduced version.
  • Performance: What if you discovered, after profiling, that the "other" STL implementation gives you significant better performance for a particular application. (With so many details concerning algorithms and data structures this could actually be possible.)
  • Debug mode: Some STL implementation provide nice features for debugging. For instance, checking ranges of iterators.
ltcmelo
+1 for debug mode, it's so easy to make stupid mistakes with iterators (comparing 2 from different containers, reversing a range, dereferencing a past-the-end iterator, etc...)
Matthieu M.
+3  A: 

STLport has what they call a "power debug mode" that does a whole slew of run-time checking for "the correctness of iterators and containers usage". Helps catch a number of errors that would not be immediately obvious. I highly recommend use of STLport while debugging and testing.

ChrisInEdmonton
+3  A: 

The C++ standard library can be implemented in variety of ways. Some implementers try to cope with modern ideas. So, using an optimized implementation may result in faster and smaller executables.

Take SCARY for example. Some implementers didn't do it yet, although it reduces the bloat of STL to a great extent. When you do the following:

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);

An "old" implementation could produce two different count functions in the result executable, because the type of f is not the same as of s. Thats because the iterator type depends on the type of the vector itself, although it doesn't need to be like that. A better idea is to separate the type of the iterator in a separate class, and provide a typedef in vector, and the compiler would produce one count only. That was just an example, but I think there are more to say about the quality of some implementations.

AraK
A: 

Debugging has been mentioned by several people, in terms of the ability to switch on extra diagnostic information, however another important aspect is that if you're using the platform's own STL then you may get a better experience in the debugger. This is especially true if you're using Visual Studio which has visualisers for all the standard containers.

the_mandrill
+1  A: 

STLPort has support for files bigger than 2GB through std::fstreams. Visual Studio 2005/2008 cannot handle files bigger than 2GB.

You can test your STL implementation by displaying: std::numeric_limits<std::streamsize>::max()

Cristian Adam
for large data also has STxxL(http://stxxl.sourceforge.net/)
lsalamon
A: 

Both MSVC++ and GNU g++ come with pretty good implementations of the C++ Standard Library, but there are compilers that don't, and if I had to support such compilers I would look for a 3rd party implementation of STL.

Nemanja Trifunovic