是否可以制作非常大的 STL 字符串的浅拷贝
Is it possible to make a shallow copy of very large STL strings?
下午好,我们正在构建一个 deduper 的原型。我们使用一组 STL 字符串来存储要删除的记录。 数组如下所示:
std::string* StringArray = new std::string[NumberDedupeRecords]
记录非常大,高达 160,000,000 字节。当我们尝试将记录的std::string
版本存储在std::string* StringArray
中以重复数据删除时,STL会制作字符串的深层副本,并mallocs至少具有160,000,000字节的新缓冲区。我们很快就会耗尽堆内存并得到一个std::bad_alloc exception
.有没有解决方法可以避免深层复制和std::bad_alloc
?也许我们应该使用一种新的数据结构来存储要重复删除的std::string
记录,或者我们应该保存auto_ptr
。
我们在这里显示一个代码片段:
std::string clara5(curr.getPtr());
char* const maryptr = (curr.getPtr() + n - curr.low());
maryptr[54] = 'x0';
StringArray[StringArrayCount] = clara5;
curr.mPtr = (char*)StringArray[StringArrayCount].c_str();
std::multiset<Range>::iterator miter5 = ranges_type.lower_bound(Range(n));
(*miter5).mPtr = curr.mPtr; StringArrayCount += 1;
谢谢。
您可以简单地获取指向原始std::string
的指针或引用 - 如果您发现有必要强制执行各种所有权策略,则包括智能指针。
如果可能,您可能希望更改代码,以便一次在内存中只有几个std::string
实例,而不是尝试使用智能指针。这当然取决于您的访问模式,但您可以一次加载和处理一个字符串(记录),而不是一次为所有字符串(记录)分配一个数组。
编辑:鉴于OP正在尝试删除重复项,这可能效果不佳。
我认为你的问题的真正答案是使用绳子 - 见 http://www.sgi.com/tech/stl/Rope.html - std::string 并不是真正设计用于非常大的字符串。
相关文章:
- 将stl字符串缩小到小于15个字符的容量
- 为什么 stl 字符串C++函数有时出错有时会出错?
- C++STL字符串运算符+关联性
- 比较使用不同分配器的STL字符串
- 对stl字符串和其他容器进行加密和序列化
- 关于多线程应用程序中的 STL 字符串异常
- stl - 字符串是向量
- 类中包含的 STL 字符串成员包含在 std::vector 中
- STL 字符串中的别名
- 从CPPRest库(即casablanca)获得的结果中提取基本STL字符串
- 如何从类似文件的输入中读取可变大小的字符到stl字符串中
- 如何访问STL字符串类中的成员变量?
- SWIG包装c++ for Python:将字符串列表转换为STL字符串的STL向量
- 使用c风格数组作为STL字符串操作的后端
- c++ UUID到stl字符串
- 如何以优雅/快速的方式将STL字符串向量转换为char*
- C ++ STL 字符串<错误的 PTR>但有字符串值是什么意思?
- 使用读/写STL字符串.对吗?
- 我如何解决内存泄漏,报告驻留在STL字符串
- C++ STL 字符串擦除