【发布时间】:2016-08-06 08:54:35
【问题描述】:
我正在处理一个 C++ 项目(使用 VS2008),我需要将一个非常大的 XML 文件从一个文件加载到 std::wstring。目前以下行在加载数据之前保留内存:
//std::wstring str;
//size_t ncbDataSz = file size in bytes
str.resize(ncbDataSz / sizeof(WCHAR));
但我当前的问题是resize 方法对于较大的字符串大小需要很长时间(我刚刚在x64 项目中使用12GB 的免费桌面PC 测试了它的3GB 数据RAM,大约需要 4-5 秒才能完成。)
所以我很好奇,有没有更快(更优化)的方法来调整std::string 的大小?我只要求 Windows。
【问题讨论】:
-
std::string::reserve保留,std::string::resize也写入内存...我想您将立即覆盖它。 -
您要调整大小还是保留?
-
@LogicStuff:
reserve是一只奇怪的野兽。它“保留”了内存,但不能直接以连续字节数组的形式访问它,对吧?我需要打电话给append。在那种情况下,这种类型的优化对我来说毫无用处。 -
@c00000fd 不,保留的内存将是连续的,因为每个
std::basic_string都是。否则什么都行不通。 Similar Q&A about the performance differences(迭代器不是这里的问题)。 -
@LogicStuff:是的,它是连续的。但是我如何以字节数组的形式访问它?就像我在下面的评论中显示的那样,这个
str.reserve(ncbDataSz / sizeof(WCHAR)); ReadFile(hFile, &str[0], ncbDataSz, szRead, NULL);不起作用,因为字符串内部的大小仍然为 0。
标签: c++ windows visual-studio-2008 stdstring