Я хочу прочитать файл построчно и записать одну конкретную строку ввода. Для максимальной производительности я мог бы сделать это на низком уровне, прочитав весь файл и просто перебирая его содержимое с помощью указателей, но этот код не критичен к производительности, поэтому я хочу использовать более читаемую и безопасную реализацию стиля библиотеки 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 выполняется вызывается с аргументом счетчика, равным нулю, т. е. с запросом перемещения нулевых байтов.
Вопросы:
Зачем мне нужны накладные расходы на вызов библиотечной функции в середине моего прекрасного цикла, особенно того, который вообще ничего не вызывается?
Я сам еще не разбирал его, но при каких обстоятельствах этот вызов на самом деле не будет ничего делать, а начнет перемещать куски буфера вокруг?
И почему он вообще это делает?
Дополнительный вопрос: что за тег стандартной библиотеки C ++?