C++ ostream如何管理内存?
与在堆上分配内存的C++ ostream如何管理内存?,c++,ios,ostream,C++,Ios,Ostream,与在堆上分配内存的std::string和std::ofstream相比,包含std::cout的程序似乎没有任何堆分配。我知道std::ostreams继承了xalloc,并且。后两种方法的描述是,它们确实具有某种内存管理 首先,分配或调整私有存储(长数据的动态数组)的大小 或另一个可索引的数据结构)足以使索引成为 有效索引,然后返回对 具有索引的专用存储 但是valgrind似乎表明没有任何堆分配 何时进行此分配/调整大小 std::ostreams内部是否使用new and delete或
std::string
和std::ofstream
相比,包含std::cout
的程序似乎没有任何堆分配。我知道std::ostream
s继承了xalloc,并且。后两种方法的描述是,它们确实具有某种内存管理
首先,分配或调整私有存储(长数据的动态数组)的大小
或另一个可索引的数据结构)足以使索引成为
有效索引,然后返回对
具有索引的专用存储
但是valgrind似乎表明没有任何堆分配
std::ostream
s内部是否使用new and delete或malloc and freestd::ostream
是一个基类,它允许派生类钩住它的std::streambuf
。
因此,std::ostream
可以看作是std::streambuf
指针(以及指向其区域设置和格式信息的指针)的包装器
std::streambuf
本身就是一个基类,它有一堆虚拟函数,而这些函数本身并不分配内存派生类在实现它时所做的工作。例如,实现std::fstream
的流缓冲区的std::filebuf
,为文件I/O分配缓冲区
据我所知,缓冲I/O(使用或不使用iostream)在堆上为其缓冲区分配内存,包括
std::cout
。标准输出流的缓冲区很早(在main之前)分配,并且在所有情况下都是如此。因此,当您使用或不使用std::cout
时,您的程序不会使用更多或更少的内存。至少在GNU/Linux上使用libstdc++6。其他实现可能使用以不同方式分配的特殊缓冲区。我假设std::ostream
让其内部std::streambuf
对缓冲区进行实际内存管理。