Я хочу прочитать файл построчно и захватить одну конкретную строку ввода.Для максимальной производительности я мог бы сделать это низкоуровневым способом, читая весь файл и просто перебирая его содержимое с помощью указателей, но этот код не критичен по производительности, поэтому я хочу использовать более читаемую и безопасную реализацию стиля библиотеки std.
Итак, вот что у меня есть:
std::string line;
line.reserve(1024);
std::ifstream file(filePath);
while(file)
{
std::getline(file, line);
if(line.substr(0, 8) == "Whatever")
{
// Do something ...
}
}
Хотя это не критично для производительности, я вызвал line.reserve (1024) перед операцией синтаксического анализа, чтобы исключить множественное перераспределениестрока с более крупными строками.
Внутри std :: getline строка стирается перед добавлением к ней символов из каждой строки.Я прошел по этому коду, чтобы убедиться, что память не перераспределяется при каждой итерации, а то, что я нашел, зажгло мой мозг.
Глубоко внутри string :: erase, а не просто сбрасываю переменную размера до нуля, чем на самом делеВ этом случае вызывается memmove_s со значениями указателя, которые перезаписывают используемую часть буфера незамедлительно следующей за ней неиспользуемой частью буфера, за исключением того, что memmove_s вызывается с аргументом count, равным нулю, т.е. запрашивает перемещение на ноль байтов.
Вопросы:
Зачем мне требовать накладных расходов на вызов библиотечной функции в середине моего любимого цикла, особенно того, который вызывается, чтобы ничего не делать?
Я сам еще не разобрал его, но при каких обстоятельствах этот вызов на самом деле ничего не делает, а фактически начинает перемещать куски буфера вокруг?
И почему он делает это ввсе?
Бонусный вопрос: что за тег стандартной библиотеки C ++?