使用大长度缓冲区初始化的字符串流是否会使内存使用量加倍
Does stringstream initializing with big length buffer doubles memory usage
假设我有一个长度为 100MB 的缓冲区 char[100*1024*1024]
。我想在这个缓冲区上使用 stringstream 设施,比如格式读取,所以我使用这个数组定义了一个新的 stringstream ss(arr)
。所以我想知道我的程序在运行时是否总共使用了 200MB?我正在处理大数据,内存使用至关重要。实际上我定义了一个 char 缓冲区并用这个缓冲区初始化我的自定义 istream 并解决了我的内存问题。但是我仍然很困惑我的第二种方式是否多余。
So I would like to learn if my program uses 200MB in total at runtime
or not?
如果您从 char 数组构造 stringstream
,它将至少 使内存使用量翻倍。来自std::basic_stringstream
constructor的参考:
Uses a copy of str as initial contents of the underlying string
device.
您可以编写自己的流缓冲区来创建非拥有的字符串流,但是 boost::iostreams library already provides that via array devices。
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 数组创建流。
Live example using std::stringstream
。峰值为 31(!) MiB。
Live example using boost::array_source
。峰值仅为 11 MiB。
为什么在使用 std::stringstream
时内存使用峰值甚至 3x char 数组大小?因为我们必须首先从 char 数组创建一个临时 string
,因为 std::stringstream
没有采用 char 指针的构造函数。
假设我有一个长度为 100MB 的缓冲区 char[100*1024*1024]
。我想在这个缓冲区上使用 stringstream 设施,比如格式读取,所以我使用这个数组定义了一个新的 stringstream ss(arr)
。所以我想知道我的程序在运行时是否总共使用了 200MB?我正在处理大数据,内存使用至关重要。实际上我定义了一个 char 缓冲区并用这个缓冲区初始化我的自定义 istream 并解决了我的内存问题。但是我仍然很困惑我的第二种方式是否多余。
So I would like to learn if my program uses 200MB in total at runtime or not?
如果您从 char 数组构造 stringstream
,它将至少 使内存使用量翻倍。来自std::basic_stringstream
constructor的参考:
Uses a copy of str as initial contents of the underlying string device.
您可以编写自己的流缓冲区来创建非拥有的字符串流,但是 boost::iostreams library already provides that via array devices。
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 数组创建流。
Live example using std::stringstream
。峰值为 31(!) MiB。
Live example using boost::array_source
。峰值仅为 11 MiB。
为什么在使用 std::stringstream
时内存使用峰值甚至 3x char 数组大小?因为我们必须首先从 char 数组创建一个临时 string
,因为 std::stringstream
没有采用 char 指针的构造函数。