调整std :: string的最快方法是什么?

时间:2016-08-06 08:54:35

标签: c++ windows visual-studio-2008 stdstring

我正在开发一个C ++项目(使用VS2008),我需要从文件中将一个非常大的XML文件加载到std::wstring中。目前,以下行在加载数据之前保留内存:

//std::wstring str;
//size_t ncbDataSz = file size in bytes

str.resize(ncbDataSz / sizeof(WCHAR));

但是我当前的问题是resize方法需要更长的时间才能获得更大的字符串大小(我只是在x64项目中使用3GB数据在桌面PC上测试{ {1}}空闲RAM,大约需要4-5秒才能完成。)

所以我很好奇,是否有更快(更优化)的方法来调整12GB的大小?我只要求Windows。

2 个答案:

答案 0 :(得分:2)

您可以使用char_traits实例化basic_string,它在assign(count)上不执行任何操作:

#include <string>

struct noinit_char_traits : std::char_traits<char> {
    using std::char_traits<char>::assign;
    static char_type* assign(char_type* p, std::size_t count, char_type a) { return p; }
};

using noinit_string = std::basic_string<char, noinit_char_traits>;

请注意,它还会影响basic_string :: fill()等函数。

答案 1 :(得分:1)

您可以使用std::string::reserve分配输入字符串,而不是调整输入字符串的大小,因为调整大小也会初始化每个元素。

你可以尝试这样的事情来看看它是否能改善你的表现:

std::wstring load_file(std::string const& filename)
{
    std::wifstream ifs(filename, std::ios::ate);

    // errno works on POSIX systems not sure about windows
    if(!ifs)
        throw std::runtime_error(std::strerror(errno));

    std::wstring s;
    s.reserve(ifs.tellg()); // allocate but don't initialize
    ifs.seekg(0);

    wchar_t buf[4096];
    while(ifs.read(buf, sizeof(buf)/sizeof(buf[0])))
        s.append(buf, buf + ifs.gcount()); // this will never reallocate

    return s;
}