Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does "&s[0]" point to contiguous characters in a std::string?

I'm doing some maintenance work and ran across something like the following:

std::string s; s.resize( strLength );   // strLength is a size_t with the length of a C string in it.   memcpy( &s[0], str, strLength ); 

I know using &s[0] would be safe if it was a std::vector, but is this a safe use of std::string?

like image 210
paxos1977 Avatar asked Dec 31 '09 20:12

paxos1977


People also ask

What you mean by does?

present tense third-person singular of do.

Does definition and examples?

Does references the performance or achievements of another. An example of does is telling a friend that your husband is in marketing, "He does marketing." Plural form of doe. Third-person singular simple present indicative form of do.

Does and do grammar?

“Do” is a verb in English that means “to carry out an action” and is used with the pronouns -I, -you, -we, -they, -these and -those. “Does” is the same verb but used only with third-person singular subject pronouns -he, -she, -it, -this, -that or -John.

What do you mean by a symbol?

1 : something that stands for something else : emblem The eagle is a symbol of the United States. 2 : a letter, character, or sign used instead of a word to represent a quantity, position, relationship, direction, or something to be done The sign + is the symbol for addition. symbol.


2 Answers

A std::string's allocation is not guaranteed to be contiguous under the C++98/03 standard, but C++11 forces it to be. In practice, neither I nor Herb Sutter know of an implementation that does not use contiguous storage.

Notice that the &s[0] thing is always guaranteed to work by the C++11 standard, even in the 0-length string case. It would not be guaranteed if you did str.begin() or &*str.begin(), but for &s[0] the standard defines operator[] as:

Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified

Continuing on, data() is defined as:

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].

(notice the square brackets at both ends of the range)


Notice: pre-standardization C++0x did not guarantee &s[0] to work with zero-length strings (actually, it was explicitly undefined behavior), and an older revision of this answer explained this; this has been fixed in later standard drafts, so the answer has been updated accordingly.

like image 168
Todd Gardner Avatar answered Oct 14 '22 00:10

Todd Gardner


Technically, no, since std::string is not required to store its contents contiguously in memory.

However, in almost all implementations (every implementation of which I am aware), the contents are stored contiguously and this would "work."

like image 33
James McNellis Avatar answered Oct 13 '22 23:10

James McNellis