#c
#c
Вопрос:
У меня есть эта функция:
void GetLine(std::stringstream amp;output,std::ifstream amp;input,char C){
static std::string Line;
std::getline(input,Line,C);
output.str(Line);
}
Как я могу сделать это более эффективным, чтобы не копировать данные больше, чем нужно.
Редактировать: Удален static для упрощения кода, исправлена синтаксическая ошибка. Проверка ошибок не выполняется, потому что это не нужно выполнять внутри этой функции.
Комментарии:
1. По теме: использование статического буфера строк в этой функции имеет ужасный запах кода, в частности, поскольку нет проверки ввода-вывода, чтобы узнать, что
getline
четность сработала . Я не знаю, какую проблему это призвано решить, но я совершенно уверен, что это не тот способ, которым это можно сделать.2. Установите
streambuf
указатель?3. Почему вы хотите это сделать?
4. Это специальное использование для
std::getline
, я даже не могу его скомпилировать? Что ж, предполагая, что вы хотите использовать его так, как я читал об этом, нужно ли получать одну строку в функции? вы могли бы просто сделать что-то вродеfor(std::string Line; std::getline(input, Line, input.widen(C));) output << Line << C;
для чтения всего файла в выходные данные, каждый цикл в цикле for представляет собой еще одну строку из файла.
Ответ №1:
Ваша основная проблема с производительностью заключается не в копировании, а в распределении памяти. Предполагая, что вы действительно удалили static, ваш объект stirng находится в памяти стека, но строковые данные, находящиеся в памяти, динамически распределяются в куче. Поскольку вы каждый раз создаете свою строковую операцию, у вас есть одно или несколько динамических распределений и free для каждой скопированной строки. Это очень дорогостоящие выделения.
Придание строке статичности поможет с синхронизацией за счет памяти. В большинстве реализаций библиотеки getline не изменит объем памяти, выделенный для хранения строковых данных. Таким образом, буфер строк расширится до размера самой большой строки, прочитанной из файла, и останется там. Но поскольку объект string является статическим, у вас нет способа освободить эту память. Существуют другие способы структурирования программы, которые могут решить эту проблему.
Если этот фрагмент кода действительно является задержкой в вашем коде (откуда вы знаете, что это так?), и ваш ввод имеет максимальную длину строки, тогда не используйте std:: string и используйте istream:: getline для чтения в массив символов. Это приведет к появлению ошибки в ifstream, если вы обнаружите строку длиннее вашего буфера. Вставка в массив символов выполняется быстрее, чем вставка в строку. Однако я был бы удивлен, если этот код действительно занимает так много времени.