Я использовал это:
ifstream in("file.txt")
string line;
getline(in,line);
istringstream iss(line);
...
для простого анализа.
Я хотел бы избежать ненужного копирования для повышения производительности, поэтому я попытался:
ifstream in("huge_line.txt");
string line;
getline(in,line);
istringstream ss;
ss.rdbuf()->pubsetbuf(const_cast<char*>(line.c_str()), line.size());
...
и, кажется, делает свою работу (то есть значительно повышает производительность). Мой вопрос, это безопасно с учетом const_cast?
Я имею в виду, что пока я работаю с istrinstream, внутренний буфер никогда не должен записываться классом istringstream, поэтому переменная ss должна оставаться в допустимом состоянии, пока строковая переменная является действительной и неизменной, верно?
const_cast
безопасно, потому что основной буфер std::string
не является const
, И да, пока line
не истекает пока ss
Читается из, ваша программа должна быть в порядке.
Эффект ss.rdbuf()->pubsetbuf
определяется реализацией и, следовательно, не обязательно делает то, что вы ожидаете.
Таким образом, эффект вашего измененного кода не должен быть эквивалентным исходному.