I’d consider it quite safe to assume that std::string allocates its storage contiguously.
At the present time, all known implementations of std::string
allocate space contiguously.
Moreover, the current draft of C++ 0x (N3000) [Edit: Warning, direct link to large PDF] requires that the space be allocated contiguously (ยง21.4.1/5):
The char-like objects in a
basic_string object shall be stored
contiguously. That is, for any
basic_string object s, the identity
&*(s.begin() + n) == &*s.begin() + n
shall hold for all values of n such
that 0 <= n < s.size().
As such, the chances of a current or future implementation of std::string
using non-contiguous storage are essentially nil.