使用大长度缓冲区初始化字符串流是否会使内存使用量加倍
Does stringstream initializing with big length buffer doubles memory usage
假设我有一个长度为 100MB 的缓冲区char[100*1024*1024]
。我想在这个缓冲区上使用字符串流工具,例如格式读取,所以我使用此数组定义了一个新的stringstream ss(arr)
。所以我想了解我的程序在运行时是否总共使用 200MB?我正在研究大数据,内存使用至关重要。实际上,我定义了一个char缓冲区并使用此缓冲区初始化了我的自定义istream,并解决了我的内存问题。但我仍然困惑我的第二条路是否多余。
所以我想了解我的程序在运行时是否总共使用 200MB 要不?
如果从 char 数组构造stringstream
,则内存使用量至少会增加一倍。从std::basic_stringstream
构造函数的引用:
使用 str 的副本作为基础字符串的初始内容 装置。
您可以编写自己的流缓冲区来创建非拥有字符串流,但 boost::iostreams 库已经通过数组设备提供了它。
namespace io = boost::iostreams;
char str[100*1024*1024];
// No copy of str is made here! The stream just stores pointer and size of array.
io::stream<io::array_source> strm( str, sizeof(str) );
// Do something with the stream as usual. It is fully compatible with standard streams.
int x;
strm >> x;
有一个很好的在线编译器,可以显示峰值内存使用量。 在以下示例中,我将从 10 MiB 数组创建流。
使用std::stringstream
的现场示例。峰值为 31(!米布。
使用boost::array_source
的现场示例。峰值仅为 11 MiB。
为什么在使用 char 数组大小时,内存使用峰值甚至std::stringstream
3倍?因为我们必须首先从 char 数组创建一个临时string
std::stringstream
因为它没有接受 char 指针的构造函数。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 我在二维向量中是否正确分配了内存
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 内存围栏是否涉及内核
- 我是否生成线程并导致内存泄漏?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 释放动态分配的内存时是否需要执行此额外步骤
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 当新的故障时,是否有必要留出一些紧急内存?
- 如何检查链表是否内存不足/已满