2016-11-10 23 views
0

我打得周围godbolt.org,并注意到由编译器增加了一些"extra code"“空的main()”iostream头里面包含使用静态数据。iostream头

寻找到标准之后,我想通这些都需要构造并初始化cincoutcerrclogwcinwcoutwcerrwclog,如果他们没有已建成/初始化的对象。

N4606:§27.5.3.1.6

27.5.3.1.6 Class ios_base::Init [ios::Init] 

namespace std { 
    class ios_base::Init { 
     public: 
     Init(); 
     ~Init(); 
     private: 
     static int init_cnt; // exposition only 
    }; 
} 

但对于static数据所有的标准说,它计算的构造函数和析构函数调用的class Init数量,并初始化为零。

2为表述起见,保持数据这里介绍 为:(2.1) - 静态INT init_cnt,计算构造的 析构函数调用类初始化,初始化为零的数量。

我没有得到的是static int init_cnt;这里有什么用? 为什么我们需要计算构造函数/析构函数的调用次数?

+1

看起来像它只用于刷新最后一个销毁(来自cppreference):*类跟踪创建了多少个实例,并在构造第一个实例时初始化C++流以及刷新输出当最后一个实例被破坏时流出。* – NathanOliver

+0

https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter解释了一些 – jcoder

回答

4

基于https://github.com/maniacbug/StandardCplusplus/blob/master/ios.cpp#L163我认为如果需要然后在程序结束时,全局变量调用析构函数可以适当破坏CIN,COUT,CERR,堵塞,WCIN,wcout,wcerr和wclog。

http://www.csci.csusb.edu/dick/c++std/september/lib-iostreams.html

〜初始化();

效果: 销毁类初始化的目的。该函数从存储在init_cnt中的值中减去 ,并且如果得到的存储值是 之一,则调用ccer.flush(),cerr.flush(),clog.flush(),wcout.flush(), wcerr。 flush(),wclog.flush()。