У меня есть метод load(..)
, который загружает содержимое файла в std::wstring
. Обычно он обрабатывает довольно большие файлы (до нескольких МБ), и я использую его широко, поэтому я ищу возможности оптимизации (не нарушая простоту «загружать содержимое файла в строку» и не создавая дополнительных зависимостей для других библиотек).Будет ли я извлекать пользу из применения перемещения семантической или обратной оптимизации-значения для функции, которая возвращает содержимое файла как строку?
Следует ли использовать семантику перемещения здесь (я не совсем знаком с этим)? Или способ, которым я написал это, близок к наиболее оптимальным по времени из-за оптимизации возвращаемой стоимости, который будет выполнять компилятор?
inline static std::wstring load(std::wstring filePath) {
std::wifstream file(filePath.c_str());
if(file){
std::wstring fileString;
fileString.reserve((size_t)file.tellg());
file.seekg(0);
while(!file.eof()){
fileString += file.get();
}
file.close();
return fileString;
}
file.close();
ERROR_HANDLE(L"File could not be open:\n" + filePath);
return L"";
}
Положитесь на использование 'load', если вы используете его как этот' станд :: wstring контента = нагрузки (путь), 'вы уже используете двигаться семантический, двигаться конструктор в этом случае. – fghj
Вам нужно написать механизм перемещения самостоятельно, если вы создаете класс. Вам нужно будет заставить двигаться, если у вас есть что-то среднее между вызовом 'load' и назначением' wstring', который заставляет 'wstring' передавать lvalue. В противном случае движение уже происходит. –
Перемещение происходит в любом случае, но вы непреднамеренно отключите rvo. Правила просты: либо возвратите один и тот же объект по всем путям возврата (nrvo), либо верните временный путь во все пути возврата (urvo). Вы можете смешать два, но тогда происходит только urvo. Таким образом, ваш код оптимизирует редкий случай (файл не существует), но наказывает общий случай (файл существует). – jepio