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