This depends on the compiler, the target word size and the version of the standard library.
On pre-C++11 systems, it was possible (and fairly common) for std::string to use Copy-on-Write (CoW) mechanisms. In this case I think implementations would just contain a pointer to a string implementation object.
Post C++11, CoW has been forbidden and also the standard requires std::string::length() to be constant time. This latter requirement effectively obliges string implementations to contain at least a pointer and a length field. Add that the need for a 'reserved' field (since the std::string
can have more memory reserved than is being used).
Here are a couple of good references on the subject of C++11 and later std::strings: