What actually is done when string::c_str()
is invoked?
string::c_str()
will allocate memory, copy the internal data of the string object and append a null-terminated character to the newly allocated memory?
or
- Since
string::c_str()
must be O(1), so allocating memory and copying thestring
over is no longer allowed. In practice having the null-terminator there all the time is the only sane implementation.
Somebody in the comments of this answer of this question says that C++11 requires that std::string
allocate an extra char
for a trailing '\0'
. So it seems the second option is possible.
And another person says that std::string
operations - e.g. iteration, concatenation and element mutation - don't need the zero terminator. Unless you pass the string
to a function expecting a zero terminated string, it can be omitted.
And more voice from an expert:
Why is it common for implementers to make .data() and .c_str() do the same thing?
Because it is more efficient to do so. The only way to make .data() return something that is not null terminated, would be to have .c_str() or .data() copy their internal buffer, or to just use 2 buffers. Having a single null terminated buffer always means that you can always use just one internal buffer when implementing std::string.
So I am really confused now, what actually is done when string::c_str()
is invoked?
Aucun commentaire:
Enregistrer un commentaire