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

Does stringstream initializing with big length buffer doubles memory usage

本文关键字:是否 内存 使用量 字符串 缓冲区 初始化      更新时间:2023-10-16

假设我有一个长度为 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::stringstream3?因为我们必须首先从 char 数组创建一个临时stringstd::stringstream因为它没有接受 char 指针的构造函数。