简体   繁体   中英

std::istringstream from std::string without copying

I've been using this:

ifstream in("file.txt")
string line;    
getline(in,line);
istringstream iss(line);
...

for some simple parsing. I would like to avoid unnecessary copying in order to improve performance so I tried:

ifstream in("huge_line.txt");
string line;
getline(in,line);
istringstream ss;
ss.rdbuf()->pubsetbuf(const_cast<char*>(line.c_str()), line.size());
...

and it seems to do the job (significantly improve performance, that is). My question is, is this safe given the const_cast? I mean, as long as I'm working with an istrinstream, the internal buffer should never get written to by the istringstream class, so the ss variable should remain in a valid state as long as the line variable is valid and unchanged, right?

The const_cast is safe, because the underlying buffer of std::string is not const . And yes, as long as line does not expire while ss is being read from, your program should be fine.

The effect of ss.rdbuf()->pubsetbuf is implementation-defined and hence doesn't necessarily do what you expect.

So, the effect of your altered code doesn't need to be equivalent to the initial one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM