OSDN Git Service

27baae874135b89ee5e639188bc66613f718a723
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / doc / html / manual / bk01apas05.html
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Design Notes</title><meta name="generator" content="DocBook XSL Stylesheets V1.73.2" /><meta name="keywords" content="&#10;      ISO C++&#10;    , &#10;      library&#10;    " /><link rel="start" href="../spine.html" title="The GNU C++ Library Documentation" /><link rel="up" href="appendix_contributing.html" title="Appendix A. Contributing" /><link rel="prev" href="bk01apas04.html" title="Documentation Style" /><link rel="next" href="appendix_porting.html" title="Appendix B. Porting and Maintenance" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Design Notes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk01apas04.html">Prev</a> </td><th width="60%" align="center">Appendix A. Contributing</th><td width="20%" align="right"> <a accesskey="n" href="appendix_porting.html">Next</a></td></tr></table><hr /></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="contrib.design_notes"></a>Design Notes</h2></div></div></div><p>
4   </p><div class="literallayout"><p><br />
5 <br />
6     The Library<br />
7     -----------<br />
8 <br />
9     This paper is covers two major areas:<br />
10 <br />
11     - Features and policies not mentioned in the standard that<br />
12     the quality of the library implementation depends on, including<br />
13     extensions and "implementation-defined" features;<br />
14 <br />
15     - Plans for required but unimplemented library features and<br />
16     optimizations to them.<br />
17 <br />
18     Overhead<br />
19     --------<br />
20 <br />
21     The standard defines a large library, much larger than the standard<br />
22     C library. A naive implementation would suffer substantial overhead<br />
23     in compile time, executable size, and speed, rendering it unusable<br />
24     in many (particularly embedded) applications. The alternative demands<br />
25     care in construction, and some compiler support, but there is no<br />
26     need for library subsets.<br />
27 <br />
28     What are the sources of this overhead?  There are four main causes:<br />
29 <br />
30     - The library is specified almost entirely as templates, which<br />
31     with current compilers must be included in-line, resulting in<br />
32     very slow builds as tens or hundreds of thousands of lines<br />
33     of function definitions are read for each user source file.<br />
34     Indeed, the entire SGI STL, as well as the dos Reis valarray,<br />
35     are provided purely as header files, largely for simplicity in<br />
36     porting. Iostream/locale is (or will be) as large again.<br />
37 <br />
38     - The library is very flexible, specifying a multitude of hooks<br />
39     where users can insert their own code in place of defaults.<br />
40     When these hooks are not used, any time and code expended to<br />
41     support that flexibility is wasted.<br />
42 <br />
43     - Templates are often described as causing to "code bloat". In<br />
44     practice, this refers (when it refers to anything real) to several<br />
45     independent processes. First, when a class template is manually<br />
46     instantiated in its entirely, current compilers place the definitions<br />
47     for all members in a single object file, so that a program linking<br />
48     to one member gets definitions of all. Second, template functions<br />
49     which do not actually depend on the template argument are, under<br />
50     current compilers, generated anew for each instantiation, rather<br />
51     than being shared with other instantiations. Third, some of the<br />
52     flexibility mentioned above comes from virtual functions (both in<br />
53     regular classes and template classes) which current linkers add<br />
54     to the executable file even when they manifestly cannot be called.<br />
55 <br />
56     - The library is specified to use a language feature, exceptions,<br />
57     which in the current gcc compiler ABI imposes a run time and<br />
58     code space cost to handle the possibility of exceptions even when<br />
59     they are not used. Under the new ABI (accessed with -fnew-abi),<br />
60     there is a space overhead and a small reduction in code efficiency<br />
61     resulting from lost optimization opportunities associated with<br />
62     non-local branches associated with exceptions.<br />
63 <br />
64     What can be done to eliminate this overhead?  A variety of coding<br />
65     techniques, and compiler, linker and library improvements and<br />
66     extensions may be used, as covered below. Most are not difficult,<br />
67     and some are already implemented in varying degrees.<br />
68 <br />
69     Overhead: Compilation Time<br />
70     --------------------------<br />
71 <br />
72     Providing "ready-instantiated" template code in object code archives<br />
73     allows us to avoid generating and optimizing template instantiations<br />
74     in each compilation unit which uses them. However, the number of such<br />
75     instantiations that are useful to provide is limited, and anyway this<br />
76     is not enough, by itself, to minimize compilation time. In particular,<br />
77     it does not reduce time spent parsing conforming headers.<br />
78 <br />
79     Quicker header parsing will depend on library extensions and compiler<br />
80     improvements.  One approach is some variation on the techniques<br />
81     previously marketed as "pre-compiled headers", now standardized as<br />
82     support for the "export" keyword. "Exported" template definitions<br />
83     can be placed (once) in a "repository" -- really just a library, but<br />
84     of template definitions rather than object code -- to be drawn upon<br />
85     at link time when an instantiation is needed, rather than placed in<br />
86     header files to be parsed along with every compilation unit.<br />
87 <br />
88     Until "export" is implemented we can put some of the lengthy template<br />
89     definitions in #if guards or alternative headers so that users can skip<br />
90     over the full definitions when they need only the ready-instantiated<br />
91     specializations.<br />
92 <br />
93     To be precise, this means that certain headers which define<br />
94     templates which users normally use only for certain arguments<br />
95     can be instrumented to avoid exposing the template definitions<br />
96     to the compiler unless a macro is defined. For example, in<br />
97     &lt;string&gt;, we might have:<br />
98 <br />
99     template &lt;class _CharT, ... &gt; class basic_string {<br />
100     ... // member declarations<br />
101     };<br />
102     ... // operator declarations<br />
103 <br />
104     #ifdef _STRICT_ISO_<br />
105     # if _G_NO_TEMPLATE_EXPORT<br />
106     #   include &lt;bits/std_locale.h&gt;  // headers needed by definitions<br />
107     #   ...<br />
108     #   include &lt;bits/string.tcc&gt;  // member and global template definitions.<br />
109     # endif<br />
110     #endif<br />
111 <br />
112     Users who compile without specifying a strict-ISO-conforming flag<br />
113     would not see many of the template definitions they now see, and rely<br />
114     instead on ready-instantiated specializations in the library. This<br />
115     technique would be useful for the following substantial components:<br />
116     string, locale/iostreams, valarray. It would *not* be useful or<br />
117     usable with the following: containers, algorithms, iterators,<br />
118     allocator. Since these constitute a large (though decreasing)<br />
119     fraction of the library, the benefit the technique offers is<br />
120     limited.<br />
121 <br />
122     The language specifies the semantics of the "export" keyword, but<br />
123     the gcc compiler does not yet support it. When it does, problems<br />
124     with large template inclusions can largely disappear, given some<br />
125     minor library reorganization, along with the need for the apparatus<br />
126     described above.<br />
127 <br />
128     Overhead: Flexibility Cost<br />
129     --------------------------<br />
130 <br />
131     The library offers many places where users can specify operations<br />
132     to be performed by the library in place of defaults. Sometimes<br />
133     this seems to require that the library use a more-roundabout, and<br />
134     possibly slower, way to accomplish the default requirements than<br />
135     would be used otherwise.<br />
136 <br />
137     The primary protection against this overhead is thorough compiler<br />
138     optimization, to crush out layers of inline function interfaces.<br />
139     Kuck &amp; Associates has demonstrated the practicality of this kind<br />
140     of optimization.<br />
141 <br />
142     The second line of defense against this overhead is explicit<br />
143     specialization. By defining helper function templates, and writing<br />
144     specialized code for the default case, overhead can be eliminated<br />
145     for that case without sacrificing flexibility. This takes full<br />
146     advantage of any ability of the optimizer to crush out degenerate<br />
147     code.<br />
148 <br />
149     The library specifies many virtual functions which current linkers<br />
150     load even when they cannot be called. Some minor improvements to the<br />
151     compiler and to ld would eliminate any such overhead by simply<br />
152     omitting virtual functions that the complete program does not call.<br />
153     A prototype of this work has already been done. For targets where<br />
154     GNU ld is not used, a "pre-linker" could do the same job.<br />
155 <br />
156     The main areas in the standard interface where user flexibility<br />
157     can result in overhead are:<br />
158 <br />
159     - Allocators:  Containers are specified to use user-definable<br />
160     allocator types and objects, making tuning for the container<br />
161     characteristics tricky.<br />
162 <br />
163     - Locales: the standard specifies locale objects used to implement<br />
164     iostream operations, involving many virtual functions which use<br />
165     streambuf iterators.<br />
166 <br />
167     - Algorithms and containers: these may be instantiated on any type,<br />
168     frequently duplicating code for identical operations.<br />
169 <br />
170     - Iostreams and strings: users are permitted to use these on their<br />
171     own types, and specify the operations the stream must use on these<br />
172     types.<br />
173 <br />
174     Note that these sources of overhead are _avoidable_. The techniques<br />
175     to avoid them are covered below.<br />
176 <br />
177     Code Bloat<br />
178     ----------<br />
179 <br />
180     In the SGI STL, and in some other headers, many of the templates<br />
181     are defined "inline" -- either explicitly or by their placement<br />
182     in class definitions -- which should not be inline. This is a<br />
183     source of code bloat. Matt had remarked that he was relying on<br />
184     the compiler to recognize what was too big to benefit from inlining,<br />
185     and generate it out-of-line automatically. However, this also can<br />
186     result in code bloat except where the linker can eliminate the extra<br />
187     copies.<br />
188 <br />
189     Fixing these cases will require an audit of all inline functions<br />
190     defined in the library to determine which merit inlining, and moving<br />
191     the rest out of line. This is an issue mainly in chapters 23, 25, and<br />
192     27. Of course it can be done incrementally, and we should generally<br />
193     accept patches that move large functions out of line and into ".tcc"<br />
194     files, which can later be pulled into a repository. Compiler/linker<br />
195     improvements to recognize very large inline functions and move them<br />
196     out-of-line, but shared among compilation units, could make this<br />
197     work unnecessary.<br />
198 <br />
199     Pre-instantiating template specializations currently produces large<br />
200     amounts of dead code which bloats statically linked programs. The<br />
201     current state of the static library, libstdc++.a, is intolerable on<br />
202     this account, and will fuel further confused speculation about a need<br />
203     for a library "subset". A compiler improvement that treats each<br />
204     instantiated function as a separate object file, for linking purposes,<br />
205     would be one solution to this problem. An alternative would be to<br />
206     split up the manual instantiation files into dozens upon dozens of<br />
207     little files, each compiled separately, but an abortive attempt at<br />
208     this was done for &lt;string&gt; and, though it is far from complete, it<br />
209     is already a nuisance. A better interim solution (just until we have<br />
210     "export") is badly needed.<br />
211 <br />
212     When building a shared library, the current compiler/linker cannot<br />
213     automatically generate the instantiatiations needed. This creates a<br />
214     miserable situation; it means any time something is changed in the<br />
215     library, before a shared library can be built someone must manually<br />
216     copy the declarations of all templates that are needed by other parts<br />
217     of the library to an "instantiation" file, and add it to the build<br />
218     system to be compiled and linked to the library. This process is<br />
219     readily automated, and should be automated as soon as possible.<br />
220     Users building their own shared libraries experience identical<br />
221     frustrations.<br />
222 <br />
223     Sharing common aspects of template definitions among instantiations<br />
224     can radically reduce code bloat. The compiler could help a great<br />
225     deal here by recognizing when a function depends on nothing about<br />
226     a template parameter, or only on its size, and giving the resulting<br />
227     function a link-name "equate" that allows it to be shared with other<br />
228     instantiations. Implementation code could take advantage of the<br />
229     capability by factoring out code that does not depend on the template<br />
230     argument into separate functions to be merged by the compiler.<br />
231 <br />
232     Until such a compiler optimization is implemented, much can be done<br />
233     manually (if tediously) in this direction. One such optimization is<br />
234     to derive class templates from non-template classes, and move as much<br />
235     implementation as possible into the base class. Another is to partial-<br />
236     specialize certain common instantiations, such as vector&lt;T*&gt;, to share<br />
237     code for instantiations on all types T. While these techniques work,<br />
238     they are far from the complete solution that a compiler improvement<br />
239     would afford.<br />
240 <br />
241     Overhead: Expensive Language Features<br />
242     -------------------------------------<br />
243 <br />
244     The main "expensive" language feature used in the standard library<br />
245     is exception support, which requires compiling in cleanup code with<br />
246     static table data to locate it, and linking in library code to use<br />
247     the table. For small embedded programs the amount of such library<br />
248     code and table data is assumed by some to be excessive. Under the<br />
249     "new" ABI this perception is generally exaggerated, although in some<br />
250     cases it may actually be excessive.<br />
251 <br />
252     To implement a library which does not use exceptions directly is<br />
253     not difficult given minor compiler support (to "turn off" exceptions<br />
254     and ignore exception constructs), and results in no great library<br />
255     maintenance difficulties. To be precise, given "-fno-exceptions",<br />
256     the compiler should treat "try" blocks as ordinary blocks, and<br />
257     "catch" blocks as dead code to ignore or eliminate. Compiler<br />
258     support is not strictly necessary, except in the case of "function<br />
259     try blocks"; otherwise the following macros almost suffice:<br />
260 <br />
261     #define throw(X)<br />
262     #define try      if (true)<br />
263     #define catch(X) else if (false)<br />
264 <br />
265     However, there may be a need to use function try blocks in the<br />
266     library implementation, and use of macros in this way can make<br />
267     correct diagnostics impossible. Furthermore, use of this scheme<br />
268     would require the library to call a function to re-throw exceptions<br />
269     from a try block. Implementing the above semantics in the compiler<br />
270     is preferable.<br />
271 <br />
272     Given the support above (however implemented) it only remains to<br />
273     replace code that "throws" with a call to a well-documented "handler"<br />
274     function in a separate compilation unit which may be replaced by<br />
275     the user. The main source of exceptions that would be difficult<br />
276     for users to avoid is memory allocation failures, but users can<br />
277     define their own memory allocation primitives that never throw.<br />
278     Otherwise, the complete list of such handlers, and which library<br />
279     functions may call them, would be needed for users to be able to<br />
280     implement the necessary substitutes. (Fortunately, they have the<br />
281     source code.)<br />
282 <br />
283     Opportunities<br />
284     -------------<br />
285 <br />
286     The template capabilities of C++ offer enormous opportunities for<br />
287     optimizing common library operations, well beyond what would be<br />
288     considered "eliminating overhead". In particular, many operations<br />
289     done in Glibc with macros that depend on proprietary language<br />
290     extensions can be implemented in pristine Standard C++. For example,<br />
291     the chapter 25 algorithms, and even C library functions such as strchr,<br />
292     can be specialized for the case of static arrays of known (small) size.<br />
293 <br />
294     Detailed optimization opportunities are identified below where<br />
295     the component where they would appear is discussed. Of course new<br />
296     opportunities will be identified during implementation.<br />
297 <br />
298     Unimplemented Required Library Features<br />
299     ---------------------------------------<br />
300 <br />
301     The standard specifies hundreds of components, grouped broadly by<br />
302     chapter. These are listed in excruciating detail in the CHECKLIST<br />
303     file.<br />
304 <br />
305     17 general<br />
306     18 support<br />
307     19 diagnostics<br />
308     20 utilities<br />
309     21 string<br />
310     22 locale<br />
311     23 containers<br />
312     24 iterators<br />
313     25 algorithms<br />
314     26 numerics<br />
315     27 iostreams<br />
316     Annex D  backward compatibility<br />
317 <br />
318     Anyone participating in implementation of the library should obtain<br />
319     a copy of the standard, ISO 14882.  People in the U.S. can obtain an<br />
320     electronic copy for US$18 from ANSI's web site. Those from other<br />
321     countries should visit http://www.iso.ch/ to find out the location<br />
322     of their country's representation in ISO, in order to know who can<br />
323     sell them a copy.<br />
324 <br />
325     The emphasis in the following sections is on unimplemented features<br />
326     and optimization opportunities.<br />
327 <br />
328     Chapter 17  General<br />
329     -------------------<br />
330 <br />
331     Chapter 17 concerns overall library requirements.<br />
332 <br />
333     The standard doesn't mention threads. A multi-thread (MT) extension<br />
334     primarily affects operators new and delete (18), allocator (20),<br />
335     string (21), locale (22), and iostreams (27). The common underlying<br />
336     support needed for this is discussed under chapter 20.<br />
337 <br />
338     The standard requirements on names from the C headers create a<br />
339     lot of work, mostly done. Names in the C headers must be visible<br />
340     in the std:: and sometimes the global namespace; the names in the<br />
341     two scopes must refer to the same object. More stringent is that<br />
342     Koenig lookup implies that any types specified as defined in std::<br />
343     really are defined in std::. Names optionally implemented as<br />
344     macros in C cannot be macros in C++. (An overview may be read at<br />
345     &lt;http://www.cantrip.org/cheaders.html&gt;). The scripts "inclosure"<br />
346     and "mkcshadow", and the directories shadow/ and cshadow/, are the<br />
347     beginning of an effort to conform in this area.<br />
348 <br />
349     A correct conforming definition of C header names based on underlying<br />
350     C library headers, and practical linking of conforming namespaced<br />
351     customer code with third-party C libraries depends ultimately on<br />
352     an ABI change, allowing namespaced C type names to be mangled into<br />
353     type names as if they were global, somewhat as C function names in a<br />
354     namespace, or C++ global variable names, are left unmangled. Perhaps<br />
355     another "extern" mode, such as 'extern "C-global"' would be an<br />
356     appropriate place for such type definitions. Such a type would<br />
357     affect mangling as follows:<br />
358 <br />
359     namespace A {<br />
360     struct X {};<br />
361     extern "C-global" {  // or maybe just 'extern "C"'<br />
362     struct Y {};<br />
363     };<br />
364     }<br />
365     void f(A::X*);  // mangles to f__FPQ21A1X<br />
366     void f(A::Y*);  // mangles to f__FP1Y<br />
367 <br />
368     (It may be that this is really the appropriate semantics for regular<br />
369     'extern "C"', and 'extern "C-global"', as an extension, would not be<br />
370     necessary.) This would allow functions declared in non-standard C headers<br />
371     (and thus fixable by neither us nor users) to link properly with functions<br />
372     declared using C types defined in properly-namespaced headers. The<br />
373     problem this solves is that C headers (which C++ programmers do persist<br />
374     in using) frequently forward-declare C struct tags without including<br />
375     the header where the type is defined, as in<br />
376 <br />
377     struct tm;<br />
378     void munge(tm*);<br />
379 <br />
380     Without some compiler accommodation, munge cannot be called by correct<br />
381     C++ code using a pointer to a correctly-scoped tm* value.<br />
382 <br />
383     The current C headers use the preprocessor extension "#include_next",<br />
384     which the compiler complains about when run "-pedantic".<br />
385     (Incidentally, it appears that "-fpedantic" is currently ignored,<br />
386     probably a bug.)  The solution in the C compiler is to use<br />
387     "-isystem" rather than "-I", but unfortunately in g++ this seems<br />
388     also to wrap the whole header in an 'extern "C"' block, so it's<br />
389     unusable for C++ headers. The correct solution appears to be to<br />
390     allow the various special include-directory options, if not given<br />
391     an argument, to affect subsequent include-directory options additively,<br />
392     so that if one said<br />
393 <br />
394     -pedantic -iprefix $(prefix) \<br />
395     -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \<br />
396     -iwithprefix -I g++-v3/ext<br />
397 <br />
398     the compiler would search $(prefix)/g++-v3 and not report<br />
399     pedantic warnings for files found there, but treat files in<br />
400     $(prefix)/g++-v3/ext pedantically. (The undocumented semantics<br />
401     of "-isystem" in g++ stink. Can they be rescinded?  If not it<br />
402     must be replaced with something more rationally behaved.)<br />
403 <br />
404     All the C headers need the treatment above; in the standard these<br />
405     headers are mentioned in various chapters. Below, I have only<br />
406     mentioned those that present interesting implementation issues.<br />
407 <br />
408     The components identified as "mostly complete", below, have not been<br />
409     audited for conformance. In many cases where the library passes<br />
410     conformance tests we have non-conforming extensions that must be<br />
411     wrapped in #if guards for "pedantic" use, and in some cases renamed<br />
412     in a conforming way for continued use in the implementation regardless<br />
413     of conformance flags.<br />
414 <br />
415     The STL portion of the library still depends on a header<br />
416     stl/bits/stl_config.h full of #ifdef clauses. This apparatus<br />
417     should be replaced with autoconf/automake machinery.<br />
418 <br />
419     The SGI STL defines a type_traits&lt;&gt; template, specialized for<br />
420     many types in their code including the built-in numeric and<br />
421     pointer types and some library types, to direct optimizations of<br />
422     standard functions. The SGI compiler has been extended to generate<br />
423     specializations of this template automatically for user types,<br />
424     so that use of STL templates on user types can take advantage of<br />
425     these optimizations. Specializations for other, non-STL, types<br />
426     would make more optimizations possible, but extending the gcc<br />
427     compiler in the same way would be much better. Probably the next<br />
428     round of standardization will ratify this, but probably with<br />
429     changes, so it probably should be renamed to place it in the<br />
430     implementation namespace.<br />
431 <br />
432     The SGI STL also defines a large number of extensions visible in<br />
433     standard headers. (Other extensions that appear in separate headers<br />
434     have been sequestered in subdirectories ext/ and backward/.)  All<br />
435     these extensions should be moved to other headers where possible,<br />
436     and in any case wrapped in a namespace (not std!), and (where kept<br />
437     in a standard header) girded about with macro guards. Some cannot be<br />
438     moved out of standard headers because they are used to implement<br />
439     standard features.  The canonical method for accommodating these<br />
440     is to use a protected name, aliased in macro guards to a user-space<br />
441     name. Unfortunately C++ offers no satisfactory template typedef<br />
442     mechanism, so very ad-hoc and unsatisfactory aliasing must be used<br />
443     instead.<br />
444 <br />
445     Implementation of a template typedef mechanism should have the highest<br />
446     priority among possible extensions, on the same level as implementation<br />
447     of the template "export" feature.<br />
448 <br />
449     Chapter 18  Language support<br />
450     ----------------------------<br />
451 <br />
452     Headers: &lt;limits&gt; &lt;new&gt; &lt;typeinfo&gt; &lt;exception&gt;<br />
453     C headers: &lt;cstddef&gt; &lt;climits&gt; &lt;cfloat&gt;  &lt;cstdarg&gt; &lt;csetjmp&gt;<br />
454     &lt;ctime&gt;   &lt;csignal&gt; &lt;cstdlib&gt; (also 21, 25, 26)<br />
455 <br />
456     This defines the built-in exceptions, rtti, numeric_limits&lt;&gt;,<br />
457     operator new and delete. Much of this is provided by the<br />
458     compiler in its static runtime library.<br />
459 <br />
460     Work to do includes defining numeric_limits&lt;&gt; specializations in<br />
461     separate files for all target architectures. Values for integer types<br />
462     except for bool and wchar_t are readily obtained from the C header<br />
463     &lt;limits.h&gt;, but values for the remaining numeric types (bool, wchar_t,<br />
464     float, double, long double) must be entered manually. This is<br />
465     largely dog work except for those members whose values are not<br />
466     easily deduced from available documentation. Also, this involves<br />
467     some work in target configuration to identify the correct choice of<br />
468     file to build against and to install.<br />
469 <br />
470     The definitions of the various operators new and delete must be<br />
471     made thread-safe, which depends on a portable exclusion mechanism,<br />
472     discussed under chapter 20.  Of course there is always plenty of<br />
473     room for improvements to the speed of operators new and delete.<br />
474 <br />
475     &lt;cstdarg&gt;, in Glibc, defines some macros that gcc does not allow to<br />
476     be wrapped into an inline function. Probably this header will demand<br />
477     attention whenever a new target is chosen. The functions atexit(),<br />
478     exit(), and abort() in cstdlib have different semantics in C++, so<br />
479     must be re-implemented for C++.<br />
480 <br />
481     Chapter 19  Diagnostics<br />
482     -----------------------<br />
483 <br />
484     Headers: &lt;stdexcept&gt;<br />
485     C headers: &lt;cassert&gt; &lt;cerrno&gt;<br />
486 <br />
487     This defines the standard exception objects, which are "mostly complete".<br />
488     Cygnus has a version, and now SGI provides a slightly different one.<br />
489     It makes little difference which we use.<br />
490 <br />
491     The C global name "errno", which C allows to be a variable or a macro,<br />
492     is required in C++ to be a macro. For MT it must typically result in<br />
493     a function call.<br />
494 <br />
495     Chapter 20  Utilities<br />
496     ---------------------<br />
497     Headers: &lt;utility&gt; &lt;functional&gt; &lt;memory&gt;<br />
498     C header: &lt;ctime&gt; (also in 18)<br />
499 <br />
500     SGI STL provides "mostly complete" versions of all the components<br />
501     defined in this chapter. However, the auto_ptr&lt;&gt; implementation<br />
502     is known to be wrong. Furthermore, the standard definition of it<br />
503     is known to be unimplementable as written. A minor change to the<br />
504     standard would fix it, and auto_ptr&lt;&gt; should be adjusted to match.<br />
505 <br />
506     Multi-threading affects the allocator implementation, and there must<br />
507     be configuration/installation choices for different users' MT<br />
508     requirements. Anyway, users will want to tune allocator options<br />
509     to support different target conditions, MT or no.<br />
510 <br />
511     The primitives used for MT implementation should be exposed, as an<br />
512     extension, for users' own work. We need cross-CPU "mutex" support,<br />
513     multi-processor shared-memory atomic integer operations, and single-<br />
514     processor uninterruptible integer operations, and all three configurable<br />
515     to be stubbed out for non-MT use, or to use an appropriately-loaded<br />
516     dynamic library for the actual runtime environment, or statically<br />
517     compiled in for cases where the target architecture is known.<br />
518 <br />
519     Chapter 21  String<br />
520     ------------------<br />
521     Headers: &lt;string&gt;<br />
522     C headers: &lt;cctype&gt; &lt;cwctype&gt; &lt;cstring&gt; &lt;cwchar&gt; (also in 27)<br />
523     &lt;cstdlib&gt; (also in 18, 25, 26)<br />
524 <br />
525     We have "mostly-complete" char_traits&lt;&gt; implementations. Many of the<br />
526     char_traits&lt;char&gt; operations might be optimized further using existing<br />
527     proprietary language extensions.<br />
528 <br />
529     We have a "mostly-complete" basic_string&lt;&gt; implementation. The work<br />
530     to manually instantiate char and wchar_t specializations in object<br />
531     files to improve link-time behavior is extremely unsatisfactory,<br />
532     literally tripling library-build time with no commensurate improvement<br />
533     in static program link sizes. It must be redone. (Similar work is<br />
534     needed for some components in chapters 22 and 27.)<br />
535 <br />
536     Other work needed for strings is MT-safety, as discussed under the<br />
537     chapter 20 heading.<br />
538 <br />
539     The standard C type mbstate_t from &lt;cwchar&gt; and used in char_traits&lt;&gt;<br />
540     must be different in C++ than in C, because in C++ the default constructor<br />
541     value mbstate_t() must be the "base" or "ground" sequence state.<br />
542     (According to the likely resolution of a recently raised Core issue,<br />
543     this may become unnecessary. However, there are other reasons to<br />
544     use a state type not as limited as whatever the C library provides.)<br />
545     If we might want to provide conversions from (e.g.) internally-<br />
546     represented EUC-wide to externally-represented Unicode, or vice-<br />
547     versa, the mbstate_t we choose will need to be more accommodating<br />
548     than what might be provided by an underlying C library.<br />
549 <br />
550     There remain some basic_string template-member functions which do<br />
551     not overload properly with their non-template brethren. The infamous<br />
552     hack akin to what was done in vector&lt;&gt; is needed, to conform to<br />
553     23.1.1 para 10. The CHECKLIST items for basic_string marked 'X',<br />
554     or incomplete, are so marked for this reason.<br />
555 <br />
556     Replacing the string iterators, which currently are simple character<br />
557     pointers, with class objects would greatly increase the safety of the<br />
558     client interface, and also permit a "debug" mode in which range,<br />
559     ownership, and validity are rigorously checked. The current use of<br />
560     raw pointers as string iterators is evil. vector&lt;&gt; iterators need the<br />
561     same treatment. Note that the current implementation freely mixes<br />
562     pointers and iterators, and that must be fixed before safer iterators<br />
563     can be introduced.<br />
564 <br />
565     Some of the functions in &lt;cstring&gt; are different from the C version.<br />
566     generally overloaded on const and non-const argument pointers. For<br />
567     example, in &lt;cstring&gt; strchr is overloaded. The functions isupper<br />
568     etc. in &lt;cctype&gt; typically implemented as macros in C are functions<br />
569     in C++, because they are overloaded with others of the same name<br />
570     defined in &lt;locale&gt;.<br />
571 <br />
572     Many of the functions required in &lt;cwctype&gt; and &lt;cwchar&gt; cannot be<br />
573     implemented using underlying C facilities on intended targets because<br />
574     such facilities only partly exist.<br />
575 <br />
576     Chapter 22  Locale<br />
577     ------------------<br />
578     Headers: &lt;locale&gt;<br />
579     C headers: &lt;clocale&gt;<br />
580 <br />
581     We have a "mostly complete" class locale, with the exception of<br />
582     code for constructing, and handling the names of, named locales.<br />
583     The ways that locales are named (particularly when categories<br />
584     (e.g. LC_TIME, LC_COLLATE) are different) varies among all target<br />
585     environments. This code must be written in various versions and<br />
586     chosen by configuration parameters.<br />
587 <br />
588     Members of many of the facets defined in &lt;locale&gt; are stubs. Generally,<br />
589     there are two sets of facets: the base class facets (which are supposed<br />
590     to implement the "C" locale) and the "byname" facets, which are supposed<br />
591     to read files to determine their behavior. The base ctype&lt;&gt;, collate&lt;&gt;,<br />
592     and numpunct&lt;&gt; facets are "mostly complete", except that the table of<br />
593     bitmask values used for "is" operations, and corresponding mask values,<br />
594     are still defined in libio and just included/linked. (We will need to<br />
595     implement these tables independently, soon, but should take advantage<br />
596     of libio where possible.)  The num_put&lt;&gt;::put members for integer types<br />
597     are "mostly complete".<br />
598 <br />
599     A complete list of what has and has not been implemented may be<br />
600     found in CHECKLIST. However, note that the current definition of<br />
601     codecvt&lt;wchar_t,char,mbstate_t&gt; is wrong. It should simply write<br />
602     out the raw bytes representing the wide characters, rather than<br />
603     trying to convert each to a corresponding single "char" value.<br />
604 <br />
605     Some of the facets are more important than others. Specifically,<br />
606     the members of ctype&lt;&gt;, numpunct&lt;&gt;, num_put&lt;&gt;, and num_get&lt;&gt; facets<br />
607     are used by other library facilities defined in &lt;string&gt;, &lt;istream&gt;,<br />
608     and &lt;ostream&gt;, and the codecvt&lt;&gt; facet is used by basic_filebuf&lt;&gt;<br />
609     in &lt;fstream&gt;, so a conforming iostream implementation depends on<br />
610     these.<br />
611 <br />
612     The "long long" type eventually must be supported, but code mentioning<br />
613     it should be wrapped in #if guards to allow pedantic-mode compiling.<br />
614 <br />
615     Performance of num_put&lt;&gt; and num_get&lt;&gt; depend critically on<br />
616     caching computed values in ios_base objects, and on extensions<br />
617     to the interface with streambufs.<br />
618 <br />
619     Specifically: retrieving a copy of the locale object, extracting<br />
620     the needed facets, and gathering data from them, for each call to<br />
621     (e.g.) operator&lt;&lt; would be prohibitively slow.  To cache format<br />
622     data for use by num_put&lt;&gt; and num_get&lt;&gt; we have a _Format_cache&lt;&gt;<br />
623     object stored in the ios_base::pword() array. This is constructed<br />
624     and initialized lazily, and is organized purely for utility. It<br />
625     is discarded when a new locale with different facets is imbued.<br />
626 <br />
627     Using only the public interfaces of the iterator arguments to the<br />
628     facet functions would limit performance by forbidding "vector-style"<br />
629     character operations. The streambuf iterator optimizations are<br />
630     described under chapter 24, but facets can also bypass the streambuf<br />
631     iterators via explicit specializations and operate directly on the<br />
632     streambufs, and use extended interfaces to get direct access to the<br />
633     streambuf internal buffer arrays. These extensions are mentioned<br />
634     under chapter 27. These optimizations are particularly important<br />
635     for input parsing.<br />
636 <br />
637     Unused virtual members of locale facets can be omitted, as mentioned<br />
638     above, by a smart linker.<br />
639 <br />
640     Chapter 23  Containers<br />
641     ----------------------<br />
642     Headers: &lt;deque&gt; &lt;list&gt; &lt;queue&gt; &lt;stack&gt; &lt;vector&gt; &lt;map&gt; &lt;set&gt; &lt;bitset&gt;<br />
643 <br />
644     All the components in chapter 23 are implemented in the SGI STL.<br />
645     They are "mostly complete"; they include a large number of<br />
646     nonconforming extensions which must be wrapped. Some of these<br />
647     are used internally and must be renamed or duplicated.<br />
648 <br />
649     The SGI components are optimized for large-memory environments. For<br />
650     embedded targets, different criteria might be more appropriate. Users<br />
651     will want to be able to tune this behavior. We should provide<br />
652     ways for users to compile the library with different memory usage<br />
653     characteristics.<br />
654 <br />
655     A lot more work is needed on factoring out common code from different<br />
656     specializations to reduce code size here and in chapter 25. The<br />
657     easiest fix for this would be a compiler/ABI improvement that allows<br />
658     the compiler to recognize when a specialization depends only on the<br />
659     size (or other gross quality) of a template argument, and allow the<br />
660     linker to share the code with similar specializations. In its<br />
661     absence, many of the algorithms and containers can be partial-<br />
662     specialized, at least for the case of pointers, but this only solves<br />
663     a small part of the problem. Use of a type_traits-style template<br />
664     allows a few more optimization opportunities, more if the compiler<br />
665     can generate the specializations automatically.<br />
666 <br />
667     As an optimization, containers can specialize on the default allocator<br />
668     and bypass it, or take advantage of details of its implementation<br />
669     after it has been improved upon.<br />
670 <br />
671     Replacing the vector iterators, which currently are simple element<br />
672     pointers, with class objects would greatly increase the safety of the<br />
673     client interface, and also permit a "debug" mode in which range,<br />
674     ownership, and validity are rigorously checked. The current use of<br />
675     pointers for iterators is evil.<br />
676 <br />
677     As mentioned for chapter 24, the deque iterator is a good example of<br />
678     an opportunity to implement a "staged" iterator that would benefit<br />
679     from specializations of some algorithms.<br />
680 <br />
681     Chapter 24  Iterators<br />
682     ---------------------<br />
683     Headers: &lt;iterator&gt;<br />
684 <br />
685     Standard iterators are "mostly complete", with the exception of<br />
686     the stream iterators, which are not yet templatized on the<br />
687     stream type. Also, the base class template iterator&lt;&gt; appears<br />
688     to be wrong, so everything derived from it must also be wrong,<br />
689     currently.<br />
690 <br />
691     The streambuf iterators (currently located in stl/bits/std_iterator.h,<br />
692     but should be under bits/) can be rewritten to take advantage of<br />
693     friendship with the streambuf implementation.<br />
694 <br />
695     Matt Austern has identified opportunities where certain iterator<br />
696     types, particularly including streambuf iterators and deque<br />
697     iterators, have a "two-stage" quality, such that an intermediate<br />
698     limit can be checked much more quickly than the true limit on<br />
699     range operations. If identified with a member of iterator_traits,<br />
700     algorithms may be specialized for this case. Of course the<br />
701     iterators that have this quality can be identified by specializing<br />
702     a traits class.<br />
703 <br />
704     Many of the algorithms must be specialized for the streambuf<br />
705     iterators, to take advantage of block-mode operations, in order<br />
706     to allow iostream/locale operations' performance not to suffer.<br />
707     It may be that they could be treated as staged iterators and<br />
708     take advantage of those optimizations.<br />
709 <br />
710     Chapter 25  Algorithms<br />
711     ----------------------<br />
712     Headers: &lt;algorithm&gt;<br />
713     C headers: &lt;cstdlib&gt; (also in 18, 21, 26))<br />
714 <br />
715     The algorithms are "mostly complete". As mentioned above, they<br />
716     are optimized for speed at the expense of code and data size.<br />
717 <br />
718     Specializations of many of the algorithms for non-STL types would<br />
719     give performance improvements, but we must use great care not to<br />
720     interfere with fragile template overloading semantics for the<br />
721     standard interfaces. Conventionally the standard function template<br />
722     interface is an inline which delegates to a non-standard function<br />
723     which is then overloaded (this is already done in many places in<br />
724     the library). Particularly appealing opportunities for the sake of<br />
725     iostream performance are for copy and find applied to streambuf<br />
726     iterators or (as noted elsewhere) for staged iterators, of which<br />
727     the streambuf iterators are a good example.<br />
728 <br />
729     The bsearch and qsort functions cannot be overloaded properly as<br />
730     required by the standard because gcc does not yet allow overloading<br />
731     on the extern-"C"-ness of a function pointer.<br />
732 <br />
733     Chapter 26  Numerics<br />
734     --------------------<br />
735     Headers: &lt;complex&gt; &lt;valarray&gt; &lt;numeric&gt;<br />
736     C headers: &lt;cmath&gt;, &lt;cstdlib&gt; (also 18, 21, 25)<br />
737 <br />
738     Numeric components: Gabriel dos Reis's valarray, Drepper's complex,<br />
739     and the few algorithms from the STL are "mostly done".  Of course<br />
740     optimization opportunities abound for the numerically literate. It<br />
741     is not clear whether the valarray implementation really conforms<br />
742     fully, in the assumptions it makes about aliasing (and lack thereof)<br />
743     in its arguments.<br />
744 <br />
745     The C div() and ldiv() functions are interesting, because they are the<br />
746     only case where a C library function returns a class object by value.<br />
747     Since the C++ type div_t must be different from the underlying C type<br />
748     (which is in the wrong namespace) the underlying functions div() and<br />
749     ldiv() cannot be re-used efficiently. Fortunately they are trivial to<br />
750     re-implement.<br />
751 <br />
752     Chapter 27  Iostreams<br />
753     ---------------------<br />
754     Headers: &lt;iosfwd&gt; &lt;streambuf&gt; &lt;ios&gt; &lt;ostream&gt; &lt;istream&gt; &lt;iostream&gt;<br />
755     &lt;iomanip&gt; &lt;sstream&gt; &lt;fstream&gt;<br />
756     C headers: &lt;cstdio&gt; &lt;cwchar&gt; (also in 21)<br />
757 <br />
758     Iostream is currently in a very incomplete state. &lt;iosfwd&gt;, &lt;iomanip&gt;,<br />
759     ios_base, and basic_ios&lt;&gt; are "mostly complete". basic_streambuf&lt;&gt; and<br />
760     basic_ostream&lt;&gt; are well along, but basic_istream&lt;&gt; has had little work<br />
761     done. The standard stream objects, &lt;sstream&gt; and &lt;fstream&gt; have been<br />
762     started; basic_filebuf&lt;&gt; "write" functions have been implemented just<br />
763     enough to do "hello, world".<br />
764 <br />
765     Most of the istream and ostream operators &lt;&lt; and &gt;&gt; (with the exception<br />
766     of the op&lt;&lt;(integer) ones) have not been changed to use locale primitives,<br />
767     sentry objects, or char_traits members.<br />
768 <br />
769     All these templates should be manually instantiated for char and<br />
770     wchar_t in a way that links only used members into user programs.<br />
771 <br />
772     Streambuf is fertile ground for optimization extensions. An extended<br />
773     interface giving iterator access to its internal buffer would be very<br />
774     useful for other library components.<br />
775 <br />
776     Iostream operations (primarily operators &lt;&lt; and &gt;&gt;) can take advantage<br />
777     of the case where user code has not specified a locale, and bypass locale<br />
778     operations entirely. The current implementation of op&lt;&lt;/num_put&lt;&gt;::put,<br />
779     for the integer types, demonstrates how they can cache encoding details<br />
780     from the locale on each operation. There is lots more room for<br />
781     optimization in this area.<br />
782 <br />
783     The definition of the relationship between the standard streams<br />
784     cout et al. and stdout et al. requires something like a "stdiobuf".<br />
785     The SGI solution of using double-indirection to actually use a<br />
786     stdio FILE object for buffering is unsatisfactory, because it<br />
787     interferes with peephole loop optimizations.<br />
788 <br />
789     The &lt;sstream&gt; header work has begun. stringbuf can benefit from<br />
790     friendship with basic_string&lt;&gt; and basic_string&lt;&gt;::_Rep to use<br />
791     those objects directly as buffers, and avoid allocating and making<br />
792     copies.<br />
793 <br />
794     The basic_filebuf&lt;&gt; template is a complex beast. It is specified to<br />
795     use the locale facet codecvt&lt;&gt; to translate characters between native<br />
796     files and the locale character encoding. In general this involves<br />
797     two buffers, one of "char" representing the file and another of<br />
798     "char_type", for the stream, with codecvt&lt;&gt; translating. The process<br />
799     is complicated by the variable-length nature of the translation, and<br />
800     the need to seek to corresponding places in the two representations.<br />
801     For the case of basic_filebuf&lt;char&gt;, when no translation is needed,<br />
802     a single buffer suffices. A specialized filebuf can be used to reduce<br />
803     code space overhead when no locale has been imbued. Matt Austern's<br />
804     work at SGI will be useful, perhaps directly as a source of code, or<br />
805     at least as an example to draw on.<br />
806 <br />
807     Filebuf, almost uniquely (cf. operator new), depends heavily on<br />
808     underlying environmental facilities. In current releases iostream<br />
809     depends fairly heavily on libio constant definitions, but it should<br />
810     be made independent.  It also depends on operating system primitives<br />
811     for file operations. There is immense room for optimizations using<br />
812     (e.g.) mmap for reading. The shadow/ directory wraps, besides the<br />
813     standard C headers, the libio.h and unistd.h headers, for use mainly<br />
814     by filebuf. These wrappings have not been completed, though there<br />
815     is scaffolding in place.<br />
816 <br />
817     The encapulation of certain C header &lt;cstdio&gt; names presents an<br />
818     interesting problem. It is possible to define an inline std::fprintf()<br />
819     implemented in terms of the 'extern "C"' vfprintf(), but there is no<br />
820     standard vfscanf() to use to implement std::fscanf(). It appears that<br />
821     vfscanf but be re-implemented in C++ for targets where no vfscanf<br />
822     extension has been defined. This is interesting in that it seems<br />
823     to be the only significant case in the C library where this kind of<br />
824     rewriting is necessary. (Of course Glibc provides the vfscanf()<br />
825     extension.)  (The functions related to exit() must be rewritten<br />
826     for other reasons.)<br />
827 <br />
828 <br />
829     Annex D<br />
830     -------<br />
831     Headers: &lt;strstream&gt;<br />
832 <br />
833     Annex D defines many non-library features, and many minor<br />
834     modifications to various headers, and a complete header.<br />
835     It is "mostly done", except that the libstdc++-2 &lt;strstream&gt;<br />
836     header has not been adopted into the library, or checked to<br />
837     verify that it matches the draft in those details that were<br />
838     clarified by the committee. Certainly it must at least be<br />
839     moved into the std namespace.<br />
840 <br />
841     We still need to wrap all the deprecated features in #if guards<br />
842     so that pedantic compile modes can detect their use.<br />
843 <br />
844     Nonstandard Extensions<br />
845     ----------------------<br />
846     Headers: &lt;iostream.h&gt; &lt;strstream.h&gt; &lt;hash&gt; &lt;rbtree&gt;<br />
847     &lt;pthread_alloc&gt; &lt;stdiobuf&gt; (etc.)<br />
848 <br />
849     User code has come to depend on a variety of nonstandard components<br />
850     that we must not omit. Much of this code can be adopted from<br />
851     libstdc++-v2 or from the SGI STL. This particularly includes<br />
852     &lt;iostream.h&gt;, &lt;strstream.h&gt;, and various SGI extensions such<br />
853     as &lt;hash_map.h&gt;. Many of these are already placed in the<br />
854     subdirectories ext/ and backward/. (Note that it is better to<br />
855     include them via "&lt;backward/hash_map.h&gt;" or "&lt;ext/hash_map&gt;" than<br />
856     to search the subdirectory itself via a "-I" directive.<br />
857   </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk01apas04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="appendix_contributing.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="appendix_porting.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Documentation Style </td><td width="20%" align="center"><a accesskey="h" href="../spine.html">Home</a></td><td width="40%" align="right" valign="top"> Appendix B. Porting and Maintenance</td></tr></table></div></body></html>