与在堆上分配内存的std::string
和std::ofstream
相比,包含std::cout
的程序似乎没有任何堆分配。我知道std::ostream
继承了xalloc,iword
和pword
。后两者描述了他们确实有某种内存管理。
首先,分配或调整私有存储(动态数组长) 或另一个可索引的数据结构)足以使索引a 有效索引,然后返回对long元素的引用 带索引索引的私有存储。
但是valgrind似乎表明没有任何堆分配。
std::ostream
内部使用new和delete或malloc并免费使用吗?答案 0 :(得分:2)
std::ostream
是一个基类,它允许派生类挂钩到它的std::streambuf
。
因此,std::ostream
可以被视为std::streambuf
指针的包装器(以及指向它的区域设置和格式信息的指针)。
std::streambuf
本身就是一个基类,它有一堆虚函数,它们本身并不分配内存 - 派生类在实现它时会这样做。例如std::filebuf
实现std::fstream
的流缓冲区,为文件I / O分配缓冲区。
据我所知,缓冲I / O(使用iostream与否)在堆上为其缓冲区分配内存,包括std::cout
。标准输出流的缓冲区很早就分配(在main之前)并且在所有情况下都是如此。因此,当您执行或不使用std::cout
时,您的程序将不会使用更多或更少的内存。至少在使用libstdc ++ 6的GNU / Linux上。其他实现可能使用以不同方式分配的特殊缓冲区。