使用大长度缓冲区初始化的字符串流是否会使内存使用量加倍

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 指针的构造函数。