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 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
const_cast
is safe, because the underlying buffer ofstd::string
is notconst
. And yes, as long asline
does not expire whiless
is being read from, your program should be fine.