当内存分配给预定义的流对象时?

时间:2016-01-26 12:16:14

标签: c++ memory-management initialization cout cin

在您开始将此问题标记为重复之前,我已经this,但它没有回答我的问题。

像<{1}},std::cout这样的流对象是std::cin&amp;的全局实例。 ostream个班级。但我的问题是何时将内存分配给这些对象?这些对象初始化后?是否在编译时或运行时分配内存或C ++运行时在调用main()之前在运行时初始化这些对象? istream&amp; std::cout对象驻留在:堆栈,堆或数据段中?

3 个答案:

答案 0 :(得分:3)

流对象是全局变量,因此它们将驻留在全局数据段中。他们也可以在内部为缓冲区或其他任何需要的内存分配其他内存。

它们是由一些未指定的魔法(可能是特定于实现的技巧)初始化的,尽可能早,但不迟于主要的第一个声明之前。

答案 1 :(得分:1)

  

何时将内存分配给这些对象?

与具有静态存储持续时间的其他全局对象

同时
  

初始化这些对象?

当其他静态对象被初始化时,但由于标准授权和库技巧,您将有机会使用它们。

  

std :: cout&amp; std :: cin对象驻留在:堆栈,堆或数据段中?

它们位于静态内存中。严格来说,C ++中没有堆栈,只有静态,动态和自动内存。确切的地方将取决于库的实施。

答案 2 :(得分:0)

保证在第一次构造std :: ios_base :: Init类型的对象时或之前初始化这些对象,并且这些对象可用于静态对象的构造函数和析构函数。

这是LLVM实现: https://github.com/llvm-mirror/libcxx/blob/master/src/iostream.cpp