OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [doc/] [html/] [manual/] [io.html] - Blame information for rev 750

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Chapter 13.  Input and Output</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"/><meta name="keywords" content="&#10;      ISO C++&#10;    , &#10;      library&#10;    "/><meta name="keywords" content="&#10;      ISO C++&#10;    , &#10;      runtime&#10;    , &#10;      library&#10;    "/><link rel="home" href="../index.html" title="The GNU C++ Library"/><link rel="up" href="bk01pt02.html" title="Part II.  Standard Contents"/><link rel="prev" href="numerics_and_c.html" title="Interacting with C"/><link rel="next" href="streambufs.html" title="Stream Buffers"/></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 13. 
4
  Input and Output
5
 
6
</th></tr><tr><td align="left"><a accesskey="p" href="numerics_and_c.html">Prev</a> </td><th width="60%" align="center">Part II. 
7
    Standard Contents
8
  </th><td align="right"> <a accesskey="n" href="streambufs.html">Next</a></td></tr></table><hr/></div><div class="chapter" title="Chapter 13.  Input and Output"><div class="titlepage"><div><div><h2 class="title"><a id="std.io"/>Chapter 13. 
9
  Input and Output
10
  <a id="id504933" class="indexterm"/>
11
</h2></div></div></div><div class="toc"><p><strong>Table of Contents</strong></p><dl><dt><span class="section"><a href="io.html#std.io.objects">Iostream Objects</a></span></dt><dt><span class="section"><a href="streambufs.html">Stream Buffers</a></span></dt><dd><dl><dt><span class="section"><a href="streambufs.html#io.streambuf.derived">Derived streambuf Classes</a></span></dt><dt><span class="section"><a href="streambufs.html#io.streambuf.buffering">Buffering</a></span></dt></dl></dd><dt><span class="section"><a href="stringstreams.html">Memory Based Streams</a></span></dt><dd><dl><dt><span class="section"><a href="stringstreams.html#std.io.memstreams.compat">Compatibility With strstream</a></span></dt></dl></dd><dt><span class="section"><a href="fstreams.html">File Based Streams</a></span></dt><dd><dl><dt><span class="section"><a href="fstreams.html#std.io.filestreams.copying_a_file">Copying a File</a></span></dt><dt><span class="section"><a href="fstreams.html#std.io.filestreams.binary">Binary Input and Output</a></span></dt></dl></dd><dt><span class="section"><a href="io_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="io_and_c.html#std.io.c.FILE">Using FILE* and file descriptors</a></span></dt><dt><span class="section"><a href="io_and_c.html#std.io.c.sync">Performance</a></span></dt></dl></dd></dl></div><div class="section" title="Iostream Objects"><div class="titlepage"><div><div><h2 class="title"><a id="std.io.objects"/>Iostream Objects</h2></div></div></div><p>To minimize the time you have to wait on the compiler, it's good to
12
      only include the headers you really need.  Many people simply include
13
      &lt;iostream&gt; when they don't need to -- and that can <span class="emphasis"><em>penalize
14
      your runtime as well.</em></span>  Here are some tips on which header to use
15
      for which situations, starting with the simplest.
16
   </p><p><span class="emphasis"><em>&lt;iosfwd&gt;</em></span> should be included whenever you simply
17
      need the <span class="emphasis"><em>name</em></span> of an I/O-related class, such as
18
      "ofstream" or "basic_streambuf".  Like the name
19
      implies, these are forward declarations.  (A word to all you fellow
20
      old school programmers:  trying to forward declare classes like
21
      "class istream;" won't work.  Look in the iosfwd header if
22
      you'd like to know why.)  For example,
23
   </p><pre class="programlisting">
24
    #include &lt;iosfwd&gt;
25
 
26
    class MyClass
27
    {
28
        ....
29
        std::ifstream&amp;   input_file;
30
    };
31
 
32
    extern std::ostream&amp; operator&lt;&lt; (std::ostream&amp;, MyClass&amp;);
33
   </pre><p><span class="emphasis"><em>&lt;ios&gt;</em></span> declares the base classes for the entire
34
      I/O stream hierarchy, std::ios_base and std::basic_ios&lt;charT&gt;, the
35
      counting types std::streamoff and std::streamsize, the file
36
      positioning type std::fpos, and the various manipulators like
37
      std::hex, std::fixed, std::noshowbase, and so forth.
38
   </p><p>The ios_base class is what holds the format flags, the state flags,
39
      and the functions which change them (setf(), width(), precision(),
40
      etc).  You can also store extra data and register callback functions
41
      through ios_base, but that has been historically underused.  Anything
42
      which doesn't depend on the type of characters stored is consolidated
43
      here.
44
   </p><p>The template class basic_ios is the highest template class in the
45
      hierarchy; it is the first one depending on the character type, and
46
      holds all general state associated with that type:  the pointer to the
47
      polymorphic stream buffer, the facet information, etc.
48
   </p><p><span class="emphasis"><em>&lt;streambuf&gt;</em></span> declares the template class
49
      basic_streambuf, and two standard instantiations, streambuf and
50
      wstreambuf.  If you need to work with the vastly useful and capable
51
      stream buffer classes, e.g., to create a new form of storage
52
      transport, this header is the one to include.
53
   </p><p><span class="emphasis"><em>&lt;istream&gt;</em></span>/<span class="emphasis"><em>&lt;ostream&gt;</em></span> are
54
      the headers to include when you are using the &gt;&gt;/&lt;&lt;
55
      interface, or any of the other abstract stream formatting functions.
56
      For example,
57
   </p><pre class="programlisting">
58
    #include &lt;istream&gt;
59
 
60
    std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, MyClass&amp; c)
61
    {
62
       return os &lt;&lt; c.data1() &lt;&lt; c.data2();
63
    }
64
   </pre><p>The std::istream and std::ostream classes are the abstract parents of
65
      the various concrete implementations.  If you are only using the
66
      interfaces, then you only need to use the appropriate interface header.
67
   </p><p><span class="emphasis"><em>&lt;iomanip&gt;</em></span> provides "extractors and inserters
68
      that alter information maintained by class ios_base and its derived
69
      classes," such as std::setprecision and std::setw.  If you need
70
      to write expressions like <code class="code">os &lt;&lt; setw(3);</code> or
71
      <code class="code">is &gt;&gt; setbase(8);</code>, you must include &lt;iomanip&gt;.
72
   </p><p><span class="emphasis"><em>&lt;sstream&gt;</em></span>/<span class="emphasis"><em>&lt;fstream&gt;</em></span>
73
      declare the six stringstream and fstream classes.  As they are the
74
      standard concrete descendants of istream and ostream, you will already
75
      know about them.
76
   </p><p>Finally, <span class="emphasis"><em>&lt;iostream&gt;</em></span> provides the eight standard
77
      global objects (cin, cout, etc).  To do this correctly, this header
78
      also provides the contents of the &lt;istream&gt; and &lt;ostream&gt;
79
      headers, but nothing else.  The contents of this header look like
80
   </p><pre class="programlisting">
81
    #include &lt;ostream&gt;
82
    #include &lt;istream&gt;
83
 
84
    namespace std
85
    {
86
        extern istream cin;
87
        extern ostream cout;
88
        ....
89
 
90
        // this is explained below
91
        <span class="emphasis"><em>static ios_base::Init __foo;</em></span>    // not its real name
92
    }
93
   </pre><p>Now, the runtime penalty mentioned previously:  the global objects
94
      must be initialized before any of your own code uses them; this is
95
      guaranteed by the standard.  Like any other global object, they must
96
      be initialized once and only once.  This is typically done with a
97
      construct like the one above, and the nested class ios_base::Init is
98
      specified in the standard for just this reason.
99
   </p><p>How does it work?  Because the header is included before any of your
100
      code, the <span class="emphasis"><em>__foo</em></span> object is constructed before any of
101
      your objects.  (Global objects are built in the order in which they
102
      are declared, and destroyed in reverse order.)  The first time the
103
      constructor runs, the eight stream objects are set up.
104
   </p><p>The <code class="code">static</code> keyword means that each object file compiled
105
      from a source file containing &lt;iostream&gt; will have its own
106
      private copy of <span class="emphasis"><em>__foo</em></span>.  There is no specified order
107
      of construction across object files (it's one of those pesky NP
108
      problems that make life so interesting), so one copy in each object
109
      file means that the stream objects are guaranteed to be set up before
110
      any of your code which uses them could run, thereby meeting the
111
      requirements of the standard.
112
   </p><p>The penalty, of course, is that after the first copy of
113
      <span class="emphasis"><em>__foo</em></span> is constructed, all the others are just wasted
114
      processor time.  The time spent is merely for an increment-and-test
115
      inside a function call, but over several dozen or hundreds of object
116
      files, that time can add up.  (It's not in a tight loop, either.)
117
   </p><p>The lesson?  Only include &lt;iostream&gt; when you need to use one of
118
      the standard objects in that source file; you'll pay less startup
119
      time.  Only include the header files you need to in general; your
120
      compile times will go down when there's less parsing work to do.
121
   </p></div></div><div class="navfooter"><hr/><table width="100%" summary="Navigation footer"><tr><td align="left"><a accesskey="p" href="numerics_and_c.html">Prev</a> </td><td align="center"><a accesskey="u" href="bk01pt02.html">Up</a></td><td align="right"> <a accesskey="n" href="streambufs.html">Next</a></td></tr><tr><td align="left" valign="top">Interacting with C </td><td align="center"><a accesskey="h" href="../index.html">Home</a></td><td align="right" valign="top"> Stream Buffers</td></tr></table></div></body></html>

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.