C++ 使用大长度缓冲区初始化stringstream是否会使内存使用量翻倍

C++ 使用大长度缓冲区初始化stringstream是否会使内存使用量翻倍,c++,buffer,sstream,C++,Buffer,Sstream,假设我有一个长度为100MB字符[100*1024*1024]的缓冲区。我想在这个类似缓冲区的读取格式上使用stringstream工具,所以我使用这个数组定义了一个新的stringstream ssarr。所以我想知道我的程序在运行时是否总共使用了200MB?我正在研究大数据,内存使用至关重要。实际上,我定义了一个字符缓冲区,并用这个缓冲区初始化了我的自定义istream,解决了我的内存问题。但我仍然不知道我的第二条路是否多余 所以我想知道我的程序在运行时是否总共使用了200MB 还是不 如果

假设我有一个长度为100MB字符[100*1024*1024]的缓冲区。我想在这个类似缓冲区的读取格式上使用stringstream工具,所以我使用这个数组定义了一个新的stringstream ssarr。所以我想知道我的程序在运行时是否总共使用了200MB?我正在研究大数据,内存使用至关重要。实际上,我定义了一个字符缓冲区,并用这个缓冲区初始化了我的自定义istream,解决了我的内存问题。但我仍然不知道我的第二条路是否多余

所以我想知道我的程序在运行时是否总共使用了200MB 还是不

如果从char数组构造stringstream,它将至少使内存使用量增加一倍。参考:

使用str的副本作为基础字符串的初始内容 装置

您可以编写自己的流缓冲区来创建一个不属于自己的stringstream,但是库已经提供了这个功能

有一个很好的在线编译器可以显示内存使用的峰值。 在下面的示例中,我将从一个10MIB数组创建一个流

。31岁时达到顶峰!MiB

。峰值仅为11mib


为什么在使用std::stringstream时,内存使用峰值甚至是字符数组大小的3倍?因为我们必须首先从char数组创建一个临时字符串,因为std::stringstream没有接受char指针的构造函数。

为什么不自己测量它呢?我尝试更改原始缓冲区,正如预期的那样,它不会影响stringstream。使用其他工具,如valgrind、xcode,我无法获得它,因为它们并没有显示关于stringstream内部机制的任何信息。由于这是一个关键问题,我只想确定当使用数组初始化stringstream时,是否有内存分配作为缓冲区大小。非常确定您将有重复。我没有从标准中读到任何确定性,但是stringstream包含一个stringbuf,stringbuf通常需要一个可调整大小的字符序列。您的数组无法调整大小。可能会发生的情况是,您的100 MB缓冲区将转换为std::string,该字符串将构成stringbuf的基础。它允许您将数组作为流处理,而无需进行任何新的分配。与std::stringstream相比,阵列设备不拥有阵列。
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;