Какое из следующих было бы наиболее эффективным и почему? Я склоняюсь к unique_ptr
потому что я думаю, что при возврате прочитанных данных копия не выполняется. Это просто передача права собственности на указатель.
Например, я думаю, что строка-версия создала бы временную строку, считывала бы данные в нее и, вернувшись, скопировала бы ее данные в назначенный результат?
Однако я не уверен, что я прав. Любые идеи, что я имею в виду, и что лучше?
UniquePtr:
std::unique_ptr<const char[]> ReadFile(const char* FileName)
{
std::fstream file(FileName, std::ios::in);
if (file.is_open())
{
file.seekg(0, std::ios::end);
std::size_t size = file.tellg();
std::unique_ptr<char[]> result(new char[size]);
file.seekg(0, std::ios::beg);
file.read(result.get(), size);
file.close();
return std::move(result);
}
return nullptr;
}
Вектор:
std::string ReadFile(const char* FileName)
{
std::fstream file(FileName, std::ios::in);
if (file.is_open())
{
file.seekg(0, std::ios::end);
std::vector<std::int8_t> buffer(file.tellg());
file.seekg(0, std::ios::beg);
file.read(result.data(), result.size());
file.close();
return std::string(result.data());
}
return std::string();
}
Строка:
std::string ReadFile(const char* FileName)
{
std::fstream file(FileName, std::ios::in);
if (file.is_open())
{
std::string result = std::string();
file.seekg(0, std::ios::end);
result.resize(file.tellg());
file.seekg(0, std::ios::beg);
file.read(&result[0], result.size());
file.close();
return result;
}
return std::string();
}
std::string ReadFile(const char* FileName)
{
std::fstream file(FileName, std::ios::in);
std::string result = std::string();
if (file.is_open())
{
file.seekg(0, std::ios::end);
result.resize(file.tellg());
file.seekg(0, std::ios::beg);
file.read(&result[0], result.size());
file.close();
}
return result;
}
У меня нет доказательств, но если функция имеет только один возврат, копирование elision может быть реализовано компилятором, если есть две функции возврата внутри функции, копирование elision может работать не так, как ожидалось ~~~
return std::string(result.data());
будет работать только в том случае, если данные заканчиваются нулями.
Помимо этого усложнения, он ненужно копирует из вектора в строку.
std::string
код std::string
наиболее естественен для чтения текста (текстовый режим открытия файла).
Вы не увидите большой разницы в производительности, так как файл i/o затмевает остальное, но в любом случае с С++ 03 вы, скорее всего, получите Оптимизацию возвращаемого значения (зависит от компилятора), а с С++ 11 вы получите переместите оптимизацию результата, если вы просто используете std::move
.
unique_ptr<char>
должен бытьunique_ptr<char[]>
! В любом случае, возврат по значению перемещается, если NRVO не происходит. Копирование - последнее средство.std::unique_ptr
единственным, который гарантированно будет перемещен?