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 thestringover 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