【问题标题】:How does ostream manage memory?ostream 如何管理内存?
【发布时间】:2014-09-14 14:58:00
【问题描述】:

与在堆上分配内存的std::stringstd::ofstream 相比,包含std::cout 的程序似乎没有任何堆分配。我知道std::ostreams 继承了xalloc、iwordpword。后两者有描述说他们确实有某种内存管理。

首先,分配或调整私有存储(long 的动态数组) 或其他可索引的数据结构)足以使索引 有效索引,然后返回对长元素的引用 带有索引索引的私有存储。

但 valgrind 似乎表明没有任何堆分配。

  1. 什么时候发生这种分配/调整大小?
  2. std::ostreams 内部使用 new 和 delete 还是 malloc 和 free?

【问题讨论】:

  • 我假设std::ostream 让它内部的std::streambuf 为缓冲区做实际的内存管理。

标签: c++ ios ostream


【解决方案1】:

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 上。其他实现可能会使用以不同方式分配的特殊缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多