ReadFile std :: unique_ptr vs. std :: vector vs. std :: string

时间:2013-12-31 05:20:22

标签: c++ c++11 stl

以下哪项最有效?为什么?我倾向于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();
}

2 个答案:

答案 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,您将获得结果的移动优化。