以下哪项最有效?为什么?我倾向于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();
}
答案 0 :(得分:1)
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;
}
我没有证明,但如果函数只有一个返回,复制省略可能由编译器实现,如果函数内有2个返回, copy elision可能无法按预期工作~~~
答案 1 :(得分:0)
return std::string(result.data());
仅在数据以空值终止时才有效。
除了这种复杂情况之外,它还不必要地从矢量复制到字符串。
std::string
代码最适合阅读文本(文本模式打开文件)。
你不会看到很多性能差异,因为文件i / o使其余的相形见绌,但无论如何使用C ++ 03,你很可能会得到返回值优化(取决于编译器),以及C ++ 11如果您只使用std::move
,您将获得结果的移动优化。