1 <appendix xmlns="http://docbook.org/ns/docbook" version="5.0"
2 xml:id="appendix.contrib" xreflabel="Contributing">
3 <?dbhtml filename="appendix_contributing.html"?>
8 <primary>Appendix</primary>
9 <secondary>Contributing</secondary>
13 <keyword>ISO C++</keyword>
14 <keyword>library</keyword>
21 The GNU C++ Library is part of GCC and follows the same development model,
22 so the general rules for
23 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/contribute.html">contributing
24 to GCC</link> apply. Active
25 contributors are assigned maintainership responsibility, and given
26 write access to the source repository. First-time contributors
27 should follow this procedure:
30 <section xml:id="contrib.list" xreflabel="Contributor Checklist"><info><title>Contributor Checklist</title></info>
33 <section xml:id="list.reading"><info><title>Reading</title></info>
39 Get and read the relevant sections of the C++ language
40 specification. Copies of the full ISO 14882 standard are
41 available on line via the ISO mirror site for committee
42 members. Non-members, or those who have not paid for the
43 privilege of sitting on the committee and sustained their
44 two meeting commitment for voting rights, may get a copy of
45 the standard from their respective national standards
46 organization. In the USA, this national standards
48 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ansi.org">ANSI</link>.
49 (And if you've already registered with them you can
50 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+14882-2012">buy the standard on-line</link>.)
56 The library working group bugs, and known defects, can
58 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21</link>
65 the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/prep/standards/">GNU
66 Coding Standards</link>, and chuckle when you hit the part
67 about <quote>Using Languages Other Than C</quote>.
73 Be familiar with the extensions that preceded these
74 general GNU rules. These style issues for libstdc++ can be
75 found in <link linkend="contrib.coding_style">Coding Style</link>.
81 And last but certainly not least, read the
82 library-specific information found in
83 <link linkend="appendix.porting">Porting and Maintenance</link>.
89 <section xml:id="list.copyright"><info><title>Assignment</title></info>
92 See the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/contribute.html#legal">legal prerequisites</link> for all GCC contributions.
96 Historically, the libstdc++ assignment form added the following
102 Which Belgian comic book character is better, Tintin or Asterix, and
108 While not strictly necessary, humoring the maintainers and answering
109 this question would be appreciated.
113 Please contact Benjamin Kosnik at
114 <email>bkoz+assign@redhat.com</email> if you are confused
115 about the assignment or have general licensing questions. When
116 requesting an assignment form from
117 <email>mailto:assign@gnu.org</email>, please cc the libstdc++
118 maintainer above so that progress can be monitored.
122 <section xml:id="list.getting"><info><title>Getting Sources</title></info>
125 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/svnwrite.html">Getting write access
126 (look for "Write after approval")</link>
130 <section xml:id="list.patches"><info><title>Submitting Patches</title></info>
134 Every patch must have several pieces of information before it can be
135 properly evaluated. Ideally (and to ensure the fastest possible
136 response from the maintainers) it would have all of these pieces:
142 A description of the bug and how your patch fixes this
143 bug. For new features a description of the feature and your
150 A ChangeLog entry as plain text; see the various
151 ChangeLog files for format and content. If you are
152 using emacs as your editor, simply position the insertion
153 point at the beginning of your change and hit CX-4a to bring
154 up the appropriate ChangeLog entry. See--magic! Similar
155 functionality also exists for vi.
161 A testsuite submission or sample program that will
162 easily and simply show the existing error or test new
169 The patch itself. If you are accessing the SVN
170 repository use <command>svn update; svn diff NEW</command>;
171 else, use <command>diff -cp OLD NEW</command> ... If your
172 version of diff does not support these options, then get the
173 latest version of GNU
174 diff. The <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/wiki/SvnTricks">SVN
175 Tricks</link> wiki page has information on customising the
176 output of <code>svn diff</code>.
182 When you have all these pieces, bundle them up in a
183 mail message and send it to libstdc++@gcc.gnu.org. All
184 patches and related discussion should be sent to the
185 libstdc++ mailing list.
194 <section xml:id="contrib.organization" xreflabel="Source Organization"><info><title>Directory Layout and Source Conventions</title></info>
195 <?dbhtml filename="source_organization.html"?>
199 The unpacked source directory of libstdc++ contains the files
200 needed to create the GNU C++ Library.
203 <literallayout class="normal">
204 It has subdirectories:
207 Files in HTML and text format that document usage, quirks of the
208 implementation, and contributor checklists.
211 All header files for the C++ library are within this directory,
212 modulo specific runtime-related files that are in the libsupc++
216 Files meant to be found by #include <name> directives in
217 standard-conforming user programs.
220 Headers intended to directly include standard C headers.
221 [NB: this can be enabled via --enable-cheaders=c]
224 Headers intended to include standard C headers in
225 the global namespace, and put select names into the std::
226 namespace. [NB: this is the default, and is the same as
227 --enable-cheaders=c_global]
230 Headers intended to include standard C headers
231 already in namespace std, and put select names into the std::
232 namespace. [NB: this is the same as --enable-cheaders=c_std]
235 Files included by standard headers and by other files in
239 Headers provided for backward compatibility, such as <iostream.h>.
240 They are not used in this library.
243 Headers that define extensions to the standard library. No
244 standard header refers to any of them.
247 Scripts that are used during the configure, build, make, or test
251 Files that are used in constructing the library, but are not
254 testsuites/[backward, demangle, ext, performance, thread, 17_* to 30_*]
255 Test programs are here, and may be used to begin to exercise the
256 library. Support for "make check" and "make check-install" is
257 complete, and runs through all the subdirectories here when this
258 command is issued from the build directory. Please note that
259 "make check" requires DejaGNU 1.4 or later to be installed. Please
260 note that "make check-script" calls the script mkcheck, which
261 requires bash, and which may need the paths to bash adjusted to
262 work properly, as /bin/bash is assumed.
264 Other subdirectories contain variant versions of certain files
265 that are meant to be copied or linked by the configure script.
274 In addition, a subdirectory holds the convenience library libsupc++.
277 Contains the runtime library for C++, including exception
278 handling and memory allocation and deallocation, RTTI, terminate
281 Note that glibc also has a bits/ subdirectory. We will either
282 need to be careful not to collide with names in its bits/
283 directory; or rename bits to (e.g.) cppbits/.
285 In files throughout the system, lines marked with an "XXX" indicate
286 a bug or incompletely-implemented feature. Lines marked "XXX MT"
287 indicate a place that may require attention for multi-thread safety.
292 <section xml:id="contrib.coding_style" xreflabel="Coding Style"><info><title>Coding Style</title></info>
293 <?dbhtml filename="source_code_style.html"?>
297 <section xml:id="coding_style.bad_identifiers"><info><title>Bad Identifiers</title></info>
300 Identifiers that conflict and should be avoided.
303 <literallayout class="normal">
304 This is the list of names <quote>reserved to the
305 implementation</quote> that have been claimed by certain
306 compilers and system headers of interest, and should not be used
307 in the library. It will grow, of course. We generally are
308 interested in names that are not all-caps, except for those like
351 [Note that this list is out of date. It applies to the old
352 name-mangling; in G++ 3.0 and higher a different name-mangling is
353 used. In addition, many of the bugs relating to G++ interpreting
354 these names as operators have been fixed.]
356 The full set of __* identifiers (combined from gcc/cp/lex.c and
357 gcc/cplus-dem.c) that are either old or new, but are definitely
358 recognized by the demangler, is:
486 // long double conversion members mangled as __opr
487 // http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html
492 <section xml:id="coding_style.example"><info><title>By Example</title></info>
494 <literallayout class="normal">
495 This library is written to appropriate C++ coding standards. As such,
496 it is intended to precede the recommendations of the GNU Coding
497 Standard, which can be referenced in full here:
499 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/prep/standards/standards.html#Formatting">http://www.gnu.org/prep/standards/standards.html#Formatting</link>
501 The rest of this is also interesting reading, but skip the "Design
504 The GCC coding conventions are here, and are also useful:
505 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/codingconventions.html">http://gcc.gnu.org/codingconventions.html</link>
507 In addition, because it doesn't seem to be stated explicitly anywhere
508 else, there is an 80 column source limit.
510 <filename>ChangeLog</filename> entries for member functions should use the
511 classname::member function name syntax as follows:
514 1999-04-15 Dennis Ritchie <dr@att.com>
516 * src/basic_file.cc (__basic_file::open): Fix thinko in
517 _G_HAVE_IO_FILE_OPEN bits.
520 Notable areas of divergence from what may be previous local practice
521 (particularly for GNU C) include:
523 01. Pointers and references
528 char *p = "flop"; // wrong
529 char &c = *p; // wrong
532 Reason: In C++, definitions are mixed with executable code. Here,
533 <code>p</code> is being initialized, not <code>*p</code>. This is near-universal
534 practice among C++ programmers; it is normal for C hackers
535 to switch spontaneously as they gain experience.
537 02. Operator names and parentheses
541 operator == (type) // wrong
544 Reason: The <code>==</code> is part of the function name. Separating
545 it makes the declaration look like an expression.
547 03. Function names and parentheses
551 void mangle () // wrong
554 Reason: no space before parentheses (except after a control-flow
555 keyword) is near-universal practice for C++. It identifies the
556 parentheses as the function-call operator or declarator, as
557 opposed to an expression or other overloaded use of parentheses.
559 04. Template function indentation
561 template<typename T>
563 template_function(args)
566 template<class T>
567 void template_function(args) {};
570 Reason: In class definitions, without indentation whitespace is
571 needed both above and below the declaration to distinguish
572 it visually from other members. (Also, re: "typename"
573 rather than "class".) <code>T</code> often could be <code>int</code>, which is
574 not a class. ("class", here, is an anachronism.)
576 05. Template class indentation
578 template<typename _CharT, typename _Traits>
579 class basic_ios : public ios_base
585 template<class _CharT, class _Traits>
586 class basic_ios : public ios_base
592 template<class _CharT, class _Traits>
593 class basic_ios : public ios_base
609 enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };
612 07. Member initialization lists
613 All one line, separate from class name.
617 : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
620 gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
642 09. Member functions declarations and definitions
643 Keywords such as extern, static, export, explicit, inline, etc
644 go on the line above the function name. Thus
653 Reason: GNU coding conventions dictate return types for functions
654 are on a separate line than the function name and parameter list
655 for definitions. For C++, where we have member functions that can
656 be either inline definitions or declarations, keeping to this
657 standard allows all member function names for a given class to be
658 aligned to the same margin, increasing readability.
661 10. Invocation of member functions with "this->"
662 For non-uglified names, use <code>this->name</code> to call the function.
670 Reason: Koenig lookup.
686 12. Spacing under protected and private in class declarations:
687 space above, none below
700 13. Spacing WRT return statements.
701 no extra spacing before returns, no parenthesis
720 14. Location of global variables.
721 All global variables of class type, whether in the "user visible"
722 space (e.g., <code>cin</code>) or the implementation namespace, must be defined
723 as a character array with the appropriate alignment and then later
724 re-initialized to the correct value.
726 This is due to startup issues on certain platforms, such as AIX.
727 For more explanation and examples, see <filename>src/globals.cc</filename>. All such
728 variables should be contained in that file, for simplicity.
730 15. Exception abstractions
731 Use the exception abstractions found in <filename class="headerfile">functexcept.h</filename>, which allow
732 C++ programmers to use this library with <literal>-fno-exceptions</literal>. (Even if
733 that is rarely advisable, it's a necessary evil for backwards
736 16. Exception error messages
737 All start with the name of the function where the exception is
738 thrown, and then (optional) descriptive text is added. Example:
741 __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
744 Reason: The verbose terminate handler prints out <code>exception::what()</code>,
745 as well as the typeinfo for the thrown exception. As this is the
746 default terminate handler, by putting location info into the
747 exception string, a very useful error message is printed out for
748 uncaught exceptions. So useful, in fact, that non-programmers can
749 give useful error messages, and programmers can intelligently
750 speculate what went wrong without even using a debugger.
752 17. The doxygen style guide to comments is a separate document,
755 The library currently has a mixture of GNU-C and modern C++ coding
756 styles. The GNU C usages will be combed out gradually.
760 For nonstandard names appearing in Standard headers, we are constrained
761 to use names that begin with underscores. This is called "uglification".
764 Local and argument names: <literal>__[a-z].*</literal>
766 Examples: <code>__count __ix __s1</code>
768 Type names and template formal-argument names: <literal>_[A-Z][^_].*</literal>
770 Examples: <code>_Helper _CharT _N</code>
772 Member data and function names: <literal>_M_.*</literal>
774 Examples: <code>_M_num_elements _M_initialize ()</code>
776 Static data members, constants, and enumerations: <literal>_S_.*</literal>
778 Examples: <code>_S_max_elements _S_default_value</code>
780 Don't use names in the same scope that differ only in the prefix,
781 e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names.
782 (The most tempting of these seem to be and "_T" and "__sz".)
784 Names must never have "__" internally; it would confuse name
785 unmanglers on some targets. Also, never use "__[0-9]", same reason.
787 --------------------------
802 gribble(const gribble&);
805 gribble(int __howmany);
808 operator=(const gribble&);
813 // Start with a capital letter, end with a period.
815 public_member(const char* __arg) const;
817 // In-class function definitions should be restricted to one-liners.
819 one_line() { return 0 }
822 two_lines(const char* arg)
823 { return strchr(arg, 'a'); }
826 three_lines(); // inline, but defined below.
829 template<typename _Formal_argument>
831 public_template() const throw();
833 template<typename _Iterator>
843 int _M_private_function();
852 _S_initialize_library();
855 // More-or-less-standard language features described by lack, not presence.
856 # ifndef _G_NO_LONGLONG
857 extern long long _G_global_with_a_good_long_name; // avoid globals!
860 // Avoid in-class inline definitions, define separately;
861 // likewise for member class definitions:
863 gribble::public_member() const
864 { int __local = 0; return __local; }
866 class gribble::_Helper
870 friend class gribble;
874 // Names beginning with "__": only for arguments and
875 // local variables; never use "__" in a type name, or
876 // within any name; never use "__[0-9]".
878 #endif /* _HEADER_ */
883 template<typename T> // notice: "typename", not "class", no space
884 long_return_value_type<with_many, args>
885 function_name(char* pointer, // "char *pointer" is wrong.
887 const Reference& ref)
889 // int a_local; /* wrong; see below. */
895 int a_local = 0; // declare variable at first use.
897 // char a, b, *p; /* wrong */
900 char* c = "abc"; // each variable goes on its own line, always.
902 // except maybe here...
903 for (unsigned i = 0, mask = 1; mask; ++i, mask <<= 1) {
909 : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
913 gribble::three_lines()
915 // doesn't fit in one line.
923 <section xml:id="contrib.design_notes" xreflabel="Design Notes"><info><title>Design Notes</title></info>
924 <?dbhtml filename="source_design_notes.html"?>
929 <literallayout class="normal">
934 This paper is covers two major areas:
936 - Features and policies not mentioned in the standard that
937 the quality of the library implementation depends on, including
938 extensions and "implementation-defined" features;
940 - Plans for required but unimplemented library features and
941 optimizations to them.
946 The standard defines a large library, much larger than the standard
947 C library. A naive implementation would suffer substantial overhead
948 in compile time, executable size, and speed, rendering it unusable
949 in many (particularly embedded) applications. The alternative demands
950 care in construction, and some compiler support, but there is no
951 need for library subsets.
953 What are the sources of this overhead? There are four main causes:
955 - The library is specified almost entirely as templates, which
956 with current compilers must be included in-line, resulting in
957 very slow builds as tens or hundreds of thousands of lines
958 of function definitions are read for each user source file.
959 Indeed, the entire SGI STL, as well as the dos Reis valarray,
960 are provided purely as header files, largely for simplicity in
961 porting. Iostream/locale is (or will be) as large again.
963 - The library is very flexible, specifying a multitude of hooks
964 where users can insert their own code in place of defaults.
965 When these hooks are not used, any time and code expended to
966 support that flexibility is wasted.
968 - Templates are often described as causing to "code bloat". In
969 practice, this refers (when it refers to anything real) to several
970 independent processes. First, when a class template is manually
971 instantiated in its entirely, current compilers place the definitions
972 for all members in a single object file, so that a program linking
973 to one member gets definitions of all. Second, template functions
974 which do not actually depend on the template argument are, under
975 current compilers, generated anew for each instantiation, rather
976 than being shared with other instantiations. Third, some of the
977 flexibility mentioned above comes from virtual functions (both in
978 regular classes and template classes) which current linkers add
979 to the executable file even when they manifestly cannot be called.
981 - The library is specified to use a language feature, exceptions,
982 which in the current gcc compiler ABI imposes a run time and
983 code space cost to handle the possibility of exceptions even when
984 they are not used. Under the new ABI (accessed with -fnew-abi),
985 there is a space overhead and a small reduction in code efficiency
986 resulting from lost optimization opportunities associated with
987 non-local branches associated with exceptions.
989 What can be done to eliminate this overhead? A variety of coding
990 techniques, and compiler, linker and library improvements and
991 extensions may be used, as covered below. Most are not difficult,
992 and some are already implemented in varying degrees.
994 Overhead: Compilation Time
995 --------------------------
997 Providing "ready-instantiated" template code in object code archives
998 allows us to avoid generating and optimizing template instantiations
999 in each compilation unit which uses them. However, the number of such
1000 instantiations that are useful to provide is limited, and anyway this
1001 is not enough, by itself, to minimize compilation time. In particular,
1002 it does not reduce time spent parsing conforming headers.
1004 Quicker header parsing will depend on library extensions and compiler
1005 improvements. One approach is some variation on the techniques
1006 previously marketed as "pre-compiled headers", now standardized as
1007 support for the "export" keyword. "Exported" template definitions
1008 can be placed (once) in a "repository" -- really just a library, but
1009 of template definitions rather than object code -- to be drawn upon
1010 at link time when an instantiation is needed, rather than placed in
1011 header files to be parsed along with every compilation unit.
1013 Until "export" is implemented we can put some of the lengthy template
1014 definitions in #if guards or alternative headers so that users can skip
1015 over the full definitions when they need only the ready-instantiated
1018 To be precise, this means that certain headers which define
1019 templates which users normally use only for certain arguments
1020 can be instrumented to avoid exposing the template definitions
1021 to the compiler unless a macro is defined. For example, in
1022 <string>, we might have:
1024 template <class _CharT, ... > class basic_string {
1025 ... // member declarations
1027 ... // operator declarations
1030 # if _G_NO_TEMPLATE_EXPORT
1031 # include <bits/std_locale.h> // headers needed by definitions
1033 # include <bits/string.tcc> // member and global template definitions.
1037 Users who compile without specifying a strict-ISO-conforming flag
1038 would not see many of the template definitions they now see, and rely
1039 instead on ready-instantiated specializations in the library. This
1040 technique would be useful for the following substantial components:
1041 string, locale/iostreams, valarray. It would *not* be useful or
1042 usable with the following: containers, algorithms, iterators,
1043 allocator. Since these constitute a large (though decreasing)
1044 fraction of the library, the benefit the technique offers is
1047 The language specifies the semantics of the "export" keyword, but
1048 the gcc compiler does not yet support it. When it does, problems
1049 with large template inclusions can largely disappear, given some
1050 minor library reorganization, along with the need for the apparatus
1053 Overhead: Flexibility Cost
1054 --------------------------
1056 The library offers many places where users can specify operations
1057 to be performed by the library in place of defaults. Sometimes
1058 this seems to require that the library use a more-roundabout, and
1059 possibly slower, way to accomplish the default requirements than
1060 would be used otherwise.
1062 The primary protection against this overhead is thorough compiler
1063 optimization, to crush out layers of inline function interfaces.
1064 Kuck & Associates has demonstrated the practicality of this kind
1067 The second line of defense against this overhead is explicit
1068 specialization. By defining helper function templates, and writing
1069 specialized code for the default case, overhead can be eliminated
1070 for that case without sacrificing flexibility. This takes full
1071 advantage of any ability of the optimizer to crush out degenerate
1074 The library specifies many virtual functions which current linkers
1075 load even when they cannot be called. Some minor improvements to the
1076 compiler and to ld would eliminate any such overhead by simply
1077 omitting virtual functions that the complete program does not call.
1078 A prototype of this work has already been done. For targets where
1079 GNU ld is not used, a "pre-linker" could do the same job.
1081 The main areas in the standard interface where user flexibility
1082 can result in overhead are:
1084 - Allocators: Containers are specified to use user-definable
1085 allocator types and objects, making tuning for the container
1086 characteristics tricky.
1088 - Locales: the standard specifies locale objects used to implement
1089 iostream operations, involving many virtual functions which use
1090 streambuf iterators.
1092 - Algorithms and containers: these may be instantiated on any type,
1093 frequently duplicating code for identical operations.
1095 - Iostreams and strings: users are permitted to use these on their
1096 own types, and specify the operations the stream must use on these
1099 Note that these sources of overhead are _avoidable_. The techniques
1100 to avoid them are covered below.
1105 In the SGI STL, and in some other headers, many of the templates
1106 are defined "inline" -- either explicitly or by their placement
1107 in class definitions -- which should not be inline. This is a
1108 source of code bloat. Matt had remarked that he was relying on
1109 the compiler to recognize what was too big to benefit from inlining,
1110 and generate it out-of-line automatically. However, this also can
1111 result in code bloat except where the linker can eliminate the extra
1114 Fixing these cases will require an audit of all inline functions
1115 defined in the library to determine which merit inlining, and moving
1116 the rest out of line. This is an issue mainly in clauses 23, 25, and
1117 27. Of course it can be done incrementally, and we should generally
1118 accept patches that move large functions out of line and into ".tcc"
1119 files, which can later be pulled into a repository. Compiler/linker
1120 improvements to recognize very large inline functions and move them
1121 out-of-line, but shared among compilation units, could make this
1124 Pre-instantiating template specializations currently produces large
1125 amounts of dead code which bloats statically linked programs. The
1126 current state of the static library, libstdc++.a, is intolerable on
1127 this account, and will fuel further confused speculation about a need
1128 for a library "subset". A compiler improvement that treats each
1129 instantiated function as a separate object file, for linking purposes,
1130 would be one solution to this problem. An alternative would be to
1131 split up the manual instantiation files into dozens upon dozens of
1132 little files, each compiled separately, but an abortive attempt at
1133 this was done for <string> and, though it is far from complete, it
1134 is already a nuisance. A better interim solution (just until we have
1135 "export") is badly needed.
1137 When building a shared library, the current compiler/linker cannot
1138 automatically generate the instantiations needed. This creates a
1139 miserable situation; it means any time something is changed in the
1140 library, before a shared library can be built someone must manually
1141 copy the declarations of all templates that are needed by other parts
1142 of the library to an "instantiation" file, and add it to the build
1143 system to be compiled and linked to the library. This process is
1144 readily automated, and should be automated as soon as possible.
1145 Users building their own shared libraries experience identical
1148 Sharing common aspects of template definitions among instantiations
1149 can radically reduce code bloat. The compiler could help a great
1150 deal here by recognizing when a function depends on nothing about
1151 a template parameter, or only on its size, and giving the resulting
1152 function a link-name "equate" that allows it to be shared with other
1153 instantiations. Implementation code could take advantage of the
1154 capability by factoring out code that does not depend on the template
1155 argument into separate functions to be merged by the compiler.
1157 Until such a compiler optimization is implemented, much can be done
1158 manually (if tediously) in this direction. One such optimization is
1159 to derive class templates from non-template classes, and move as much
1160 implementation as possible into the base class. Another is to partial-
1161 specialize certain common instantiations, such as vector<T*>, to share
1162 code for instantiations on all types T. While these techniques work,
1163 they are far from the complete solution that a compiler improvement
1166 Overhead: Expensive Language Features
1167 -------------------------------------
1169 The main "expensive" language feature used in the standard library
1170 is exception support, which requires compiling in cleanup code with
1171 static table data to locate it, and linking in library code to use
1172 the table. For small embedded programs the amount of such library
1173 code and table data is assumed by some to be excessive. Under the
1174 "new" ABI this perception is generally exaggerated, although in some
1175 cases it may actually be excessive.
1177 To implement a library which does not use exceptions directly is
1178 not difficult given minor compiler support (to "turn off" exceptions
1179 and ignore exception constructs), and results in no great library
1180 maintenance difficulties. To be precise, given "-fno-exceptions",
1181 the compiler should treat "try" blocks as ordinary blocks, and
1182 "catch" blocks as dead code to ignore or eliminate. Compiler
1183 support is not strictly necessary, except in the case of "function
1184 try blocks"; otherwise the following macros almost suffice:
1187 #define try if (true)
1188 #define catch(X) else if (false)
1190 However, there may be a need to use function try blocks in the
1191 library implementation, and use of macros in this way can make
1192 correct diagnostics impossible. Furthermore, use of this scheme
1193 would require the library to call a function to re-throw exceptions
1194 from a try block. Implementing the above semantics in the compiler
1197 Given the support above (however implemented) it only remains to
1198 replace code that "throws" with a call to a well-documented "handler"
1199 function in a separate compilation unit which may be replaced by
1200 the user. The main source of exceptions that would be difficult
1201 for users to avoid is memory allocation failures, but users can
1202 define their own memory allocation primitives that never throw.
1203 Otherwise, the complete list of such handlers, and which library
1204 functions may call them, would be needed for users to be able to
1205 implement the necessary substitutes. (Fortunately, they have the
1211 The template capabilities of C++ offer enormous opportunities for
1212 optimizing common library operations, well beyond what would be
1213 considered "eliminating overhead". In particular, many operations
1214 done in Glibc with macros that depend on proprietary language
1215 extensions can be implemented in pristine Standard C++. For example,
1216 the chapter 25 algorithms, and even C library functions such as strchr,
1217 can be specialized for the case of static arrays of known (small) size.
1219 Detailed optimization opportunities are identified below where
1220 the component where they would appear is discussed. Of course new
1221 opportunities will be identified during implementation.
1223 Unimplemented Required Library Features
1224 ---------------------------------------
1226 The standard specifies hundreds of components, grouped broadly by
1227 chapter. These are listed in excruciating detail in the CHECKLIST
1241 Annex D backward compatibility
1243 Anyone participating in implementation of the library should obtain
1244 a copy of the standard, ISO 14882. People in the U.S. can obtain an
1245 electronic copy for US$18 from ANSI's web site. Those from other
1246 countries should visit http://www.iso.org/ to find out the location
1247 of their country's representation in ISO, in order to know who can
1250 The emphasis in the following sections is on unimplemented features
1251 and optimization opportunities.
1256 Chapter 17 concerns overall library requirements.
1258 The standard doesn't mention threads. A multi-thread (MT) extension
1259 primarily affects operators new and delete (18), allocator (20),
1260 string (21), locale (22), and iostreams (27). The common underlying
1261 support needed for this is discussed under chapter 20.
1263 The standard requirements on names from the C headers create a
1264 lot of work, mostly done. Names in the C headers must be visible
1265 in the std:: and sometimes the global namespace; the names in the
1266 two scopes must refer to the same object. More stringent is that
1267 Koenig lookup implies that any types specified as defined in std::
1268 really are defined in std::. Names optionally implemented as
1269 macros in C cannot be macros in C++. (An overview may be read at
1270 <http://www.cantrip.org/cheaders.html>). The scripts "inclosure"
1271 and "mkcshadow", and the directories shadow/ and cshadow/, are the
1272 beginning of an effort to conform in this area.
1274 A correct conforming definition of C header names based on underlying
1275 C library headers, and practical linking of conforming namespaced
1276 customer code with third-party C libraries depends ultimately on
1277 an ABI change, allowing namespaced C type names to be mangled into
1278 type names as if they were global, somewhat as C function names in a
1279 namespace, or C++ global variable names, are left unmangled. Perhaps
1280 another "extern" mode, such as 'extern "C-global"' would be an
1281 appropriate place for such type definitions. Such a type would
1282 affect mangling as follows:
1286 extern "C-global" { // or maybe just 'extern "C"'
1290 void f(A::X*); // mangles to f__FPQ21A1X
1291 void f(A::Y*); // mangles to f__FP1Y
1293 (It may be that this is really the appropriate semantics for regular
1294 'extern "C"', and 'extern "C-global"', as an extension, would not be
1295 necessary.) This would allow functions declared in non-standard C headers
1296 (and thus fixable by neither us nor users) to link properly with functions
1297 declared using C types defined in properly-namespaced headers. The
1298 problem this solves is that C headers (which C++ programmers do persist
1299 in using) frequently forward-declare C struct tags without including
1300 the header where the type is defined, as in
1305 Without some compiler accommodation, munge cannot be called by correct
1306 C++ code using a pointer to a correctly-scoped tm* value.
1308 The current C headers use the preprocessor extension "#include_next",
1309 which the compiler complains about when run "-pedantic".
1310 (Incidentally, it appears that "-fpedantic" is currently ignored,
1311 probably a bug.) The solution in the C compiler is to use
1312 "-isystem" rather than "-I", but unfortunately in g++ this seems
1313 also to wrap the whole header in an 'extern "C"' block, so it's
1314 unusable for C++ headers. The correct solution appears to be to
1315 allow the various special include-directory options, if not given
1316 an argument, to affect subsequent include-directory options additively,
1319 -pedantic -iprefix $(prefix) \
1320 -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \
1321 -iwithprefix -I g++-v3/ext
1323 the compiler would search $(prefix)/g++-v3 and not report
1324 pedantic warnings for files found there, but treat files in
1325 $(prefix)/g++-v3/ext pedantically. (The undocumented semantics
1326 of "-isystem" in g++ stink. Can they be rescinded? If not it
1327 must be replaced with something more rationally behaved.)
1329 All the C headers need the treatment above; in the standard these
1330 headers are mentioned in various clauses. Below, I have only
1331 mentioned those that present interesting implementation issues.
1333 The components identified as "mostly complete", below, have not been
1334 audited for conformance. In many cases where the library passes
1335 conformance tests we have non-conforming extensions that must be
1336 wrapped in #if guards for "pedantic" use, and in some cases renamed
1337 in a conforming way for continued use in the implementation regardless
1338 of conformance flags.
1340 The STL portion of the library still depends on a header
1341 stl/bits/stl_config.h full of #ifdef clauses. This apparatus
1342 should be replaced with autoconf/automake machinery.
1344 The SGI STL defines a type_traits<> template, specialized for
1345 many types in their code including the built-in numeric and
1346 pointer types and some library types, to direct optimizations of
1347 standard functions. The SGI compiler has been extended to generate
1348 specializations of this template automatically for user types,
1349 so that use of STL templates on user types can take advantage of
1350 these optimizations. Specializations for other, non-STL, types
1351 would make more optimizations possible, but extending the gcc
1352 compiler in the same way would be much better. Probably the next
1353 round of standardization will ratify this, but probably with
1354 changes, so it probably should be renamed to place it in the
1355 implementation namespace.
1357 The SGI STL also defines a large number of extensions visible in
1358 standard headers. (Other extensions that appear in separate headers
1359 have been sequestered in subdirectories ext/ and backward/.) All
1360 these extensions should be moved to other headers where possible,
1361 and in any case wrapped in a namespace (not std!), and (where kept
1362 in a standard header) girded about with macro guards. Some cannot be
1363 moved out of standard headers because they are used to implement
1364 standard features. The canonical method for accommodating these
1365 is to use a protected name, aliased in macro guards to a user-space
1366 name. Unfortunately C++ offers no satisfactory template typedef
1367 mechanism, so very ad-hoc and unsatisfactory aliasing must be used
1370 Implementation of a template typedef mechanism should have the highest
1371 priority among possible extensions, on the same level as implementation
1372 of the template "export" feature.
1374 Chapter 18 Language support
1375 ----------------------------
1377 Headers: <limits> <new> <typeinfo> <exception>
1378 C headers: <cstddef> <climits> <cfloat> <cstdarg> <csetjmp>
1379 <ctime> <csignal> <cstdlib> (also 21, 25, 26)
1381 This defines the built-in exceptions, rtti, numeric_limits<>,
1382 operator new and delete. Much of this is provided by the
1383 compiler in its static runtime library.
1385 Work to do includes defining numeric_limits<> specializations in
1386 separate files for all target architectures. Values for integer types
1387 except for bool and wchar_t are readily obtained from the C header
1388 <limits.h>, but values for the remaining numeric types (bool, wchar_t,
1389 float, double, long double) must be entered manually. This is
1390 largely dog work except for those members whose values are not
1391 easily deduced from available documentation. Also, this involves
1392 some work in target configuration to identify the correct choice of
1393 file to build against and to install.
1395 The definitions of the various operators new and delete must be
1396 made thread-safe, which depends on a portable exclusion mechanism,
1397 discussed under chapter 20. Of course there is always plenty of
1398 room for improvements to the speed of operators new and delete.
1400 <cstdarg>, in Glibc, defines some macros that gcc does not allow to
1401 be wrapped into an inline function. Probably this header will demand
1402 attention whenever a new target is chosen. The functions atexit(),
1403 exit(), and abort() in cstdlib have different semantics in C++, so
1404 must be re-implemented for C++.
1406 Chapter 19 Diagnostics
1407 -----------------------
1409 Headers: <stdexcept>
1410 C headers: <cassert> <cerrno>
1412 This defines the standard exception objects, which are "mostly complete".
1413 Cygnus has a version, and now SGI provides a slightly different one.
1414 It makes little difference which we use.
1416 The C global name "errno", which C allows to be a variable or a macro,
1417 is required in C++ to be a macro. For MT it must typically result in
1420 Chapter 20 Utilities
1421 ---------------------
1422 Headers: <utility> <functional> <memory>
1423 C header: <ctime> (also in 18)
1425 SGI STL provides "mostly complete" versions of all the components
1426 defined in this chapter. However, the auto_ptr<> implementation
1427 is known to be wrong. Furthermore, the standard definition of it
1428 is known to be unimplementable as written. A minor change to the
1429 standard would fix it, and auto_ptr<> should be adjusted to match.
1431 Multi-threading affects the allocator implementation, and there must
1432 be configuration/installation choices for different users' MT
1433 requirements. Anyway, users will want to tune allocator options
1434 to support different target conditions, MT or no.
1436 The primitives used for MT implementation should be exposed, as an
1437 extension, for users' own work. We need cross-CPU "mutex" support,
1438 multi-processor shared-memory atomic integer operations, and single-
1439 processor uninterruptible integer operations, and all three configurable
1440 to be stubbed out for non-MT use, or to use an appropriately-loaded
1441 dynamic library for the actual runtime environment, or statically
1442 compiled in for cases where the target architecture is known.
1446 Headers: <string>
1447 C headers: <cctype> <cwctype> <cstring> <cwchar> (also in 27)
1448 <cstdlib> (also in 18, 25, 26)
1450 We have "mostly-complete" char_traits<> implementations. Many of the
1451 char_traits<char> operations might be optimized further using existing
1452 proprietary language extensions.
1454 We have a "mostly-complete" basic_string<> implementation. The work
1455 to manually instantiate char and wchar_t specializations in object
1456 files to improve link-time behavior is extremely unsatisfactory,
1457 literally tripling library-build time with no commensurate improvement
1458 in static program link sizes. It must be redone. (Similar work is
1459 needed for some components in clauses 22 and 27.)
1461 Other work needed for strings is MT-safety, as discussed under the
1464 The standard C type mbstate_t from <cwchar> and used in char_traits<>
1465 must be different in C++ than in C, because in C++ the default constructor
1466 value mbstate_t() must be the "base" or "ground" sequence state.
1467 (According to the likely resolution of a recently raised Core issue,
1468 this may become unnecessary. However, there are other reasons to
1469 use a state type not as limited as whatever the C library provides.)
1470 If we might want to provide conversions from (e.g.) internally-
1471 represented EUC-wide to externally-represented Unicode, or vice-
1472 versa, the mbstate_t we choose will need to be more accommodating
1473 than what might be provided by an underlying C library.
1475 There remain some basic_string template-member functions which do
1476 not overload properly with their non-template brethren. The infamous
1477 hack akin to what was done in vector<> is needed, to conform to
1478 23.1.1 para 10. The CHECKLIST items for basic_string marked 'X',
1479 or incomplete, are so marked for this reason.
1481 Replacing the string iterators, which currently are simple character
1482 pointers, with class objects would greatly increase the safety of the
1483 client interface, and also permit a "debug" mode in which range,
1484 ownership, and validity are rigorously checked. The current use of
1485 raw pointers as string iterators is evil. vector<> iterators need the
1486 same treatment. Note that the current implementation freely mixes
1487 pointers and iterators, and that must be fixed before safer iterators
1490 Some of the functions in <cstring> are different from the C version.
1491 generally overloaded on const and non-const argument pointers. For
1492 example, in <cstring> strchr is overloaded. The functions isupper
1493 etc. in <cctype> typically implemented as macros in C are functions
1494 in C++, because they are overloaded with others of the same name
1495 defined in <locale>.
1497 Many of the functions required in <cwctype> and <cwchar> cannot be
1498 implemented using underlying C facilities on intended targets because
1499 such facilities only partly exist.
1503 Headers: <locale>
1504 C headers: <clocale>
1506 We have a "mostly complete" class locale, with the exception of
1507 code for constructing, and handling the names of, named locales.
1508 The ways that locales are named (particularly when categories
1509 (e.g. LC_TIME, LC_COLLATE) are different) varies among all target
1510 environments. This code must be written in various versions and
1511 chosen by configuration parameters.
1513 Members of many of the facets defined in <locale> are stubs. Generally,
1514 there are two sets of facets: the base class facets (which are supposed
1515 to implement the "C" locale) and the "byname" facets, which are supposed
1516 to read files to determine their behavior. The base ctype<>, collate<>,
1517 and numpunct<> facets are "mostly complete", except that the table of
1518 bitmask values used for "is" operations, and corresponding mask values,
1519 are still defined in libio and just included/linked. (We will need to
1520 implement these tables independently, soon, but should take advantage
1521 of libio where possible.) The num_put<>::put members for integer types
1522 are "mostly complete".
1524 A complete list of what has and has not been implemented may be
1525 found in CHECKLIST. However, note that the current definition of
1526 codecvt<wchar_t,char,mbstate_t> is wrong. It should simply write
1527 out the raw bytes representing the wide characters, rather than
1528 trying to convert each to a corresponding single "char" value.
1530 Some of the facets are more important than others. Specifically,
1531 the members of ctype<>, numpunct<>, num_put<>, and num_get<> facets
1532 are used by other library facilities defined in <string>, <istream>,
1533 and <ostream>, and the codecvt<> facet is used by basic_filebuf<>
1534 in <fstream>, so a conforming iostream implementation depends on
1537 The "long long" type eventually must be supported, but code mentioning
1538 it should be wrapped in #if guards to allow pedantic-mode compiling.
1540 Performance of num_put<> and num_get<> depend critically on
1541 caching computed values in ios_base objects, and on extensions
1542 to the interface with streambufs.
1544 Specifically: retrieving a copy of the locale object, extracting
1545 the needed facets, and gathering data from them, for each call to
1546 (e.g.) operator<< would be prohibitively slow. To cache format
1547 data for use by num_put<> and num_get<> we have a _Format_cache<>
1548 object stored in the ios_base::pword() array. This is constructed
1549 and initialized lazily, and is organized purely for utility. It
1550 is discarded when a new locale with different facets is imbued.
1552 Using only the public interfaces of the iterator arguments to the
1553 facet functions would limit performance by forbidding "vector-style"
1554 character operations. The streambuf iterator optimizations are
1555 described under chapter 24, but facets can also bypass the streambuf
1556 iterators via explicit specializations and operate directly on the
1557 streambufs, and use extended interfaces to get direct access to the
1558 streambuf internal buffer arrays. These extensions are mentioned
1559 under chapter 27. These optimizations are particularly important
1562 Unused virtual members of locale facets can be omitted, as mentioned
1563 above, by a smart linker.
1565 Chapter 23 Containers
1566 ----------------------
1567 Headers: <deque> <list> <queue> <stack> <vector> <map> <set> <bitset>
1569 All the components in chapter 23 are implemented in the SGI STL.
1570 They are "mostly complete"; they include a large number of
1571 nonconforming extensions which must be wrapped. Some of these
1572 are used internally and must be renamed or duplicated.
1574 The SGI components are optimized for large-memory environments. For
1575 embedded targets, different criteria might be more appropriate. Users
1576 will want to be able to tune this behavior. We should provide
1577 ways for users to compile the library with different memory usage
1580 A lot more work is needed on factoring out common code from different
1581 specializations to reduce code size here and in chapter 25. The
1582 easiest fix for this would be a compiler/ABI improvement that allows
1583 the compiler to recognize when a specialization depends only on the
1584 size (or other gross quality) of a template argument, and allow the
1585 linker to share the code with similar specializations. In its
1586 absence, many of the algorithms and containers can be partial-
1587 specialized, at least for the case of pointers, but this only solves
1588 a small part of the problem. Use of a type_traits-style template
1589 allows a few more optimization opportunities, more if the compiler
1590 can generate the specializations automatically.
1592 As an optimization, containers can specialize on the default allocator
1593 and bypass it, or take advantage of details of its implementation
1594 after it has been improved upon.
1596 Replacing the vector iterators, which currently are simple element
1597 pointers, with class objects would greatly increase the safety of the
1598 client interface, and also permit a "debug" mode in which range,
1599 ownership, and validity are rigorously checked. The current use of
1600 pointers for iterators is evil.
1602 As mentioned for chapter 24, the deque iterator is a good example of
1603 an opportunity to implement a "staged" iterator that would benefit
1604 from specializations of some algorithms.
1606 Chapter 24 Iterators
1607 ---------------------
1608 Headers: <iterator>
1610 Standard iterators are "mostly complete", with the exception of
1611 the stream iterators, which are not yet templatized on the
1612 stream type. Also, the base class template iterator<> appears
1613 to be wrong, so everything derived from it must also be wrong,
1616 The streambuf iterators (currently located in stl/bits/std_iterator.h,
1617 but should be under bits/) can be rewritten to take advantage of
1618 friendship with the streambuf implementation.
1620 Matt Austern has identified opportunities where certain iterator
1621 types, particularly including streambuf iterators and deque
1622 iterators, have a "two-stage" quality, such that an intermediate
1623 limit can be checked much more quickly than the true limit on
1624 range operations. If identified with a member of iterator_traits,
1625 algorithms may be specialized for this case. Of course the
1626 iterators that have this quality can be identified by specializing
1629 Many of the algorithms must be specialized for the streambuf
1630 iterators, to take advantage of block-mode operations, in order
1631 to allow iostream/locale operations' performance not to suffer.
1632 It may be that they could be treated as staged iterators and
1633 take advantage of those optimizations.
1635 Chapter 25 Algorithms
1636 ----------------------
1637 Headers: <algorithm>
1638 C headers: <cstdlib> (also in 18, 21, 26))
1640 The algorithms are "mostly complete". As mentioned above, they
1641 are optimized for speed at the expense of code and data size.
1643 Specializations of many of the algorithms for non-STL types would
1644 give performance improvements, but we must use great care not to
1645 interfere with fragile template overloading semantics for the
1646 standard interfaces. Conventionally the standard function template
1647 interface is an inline which delegates to a non-standard function
1648 which is then overloaded (this is already done in many places in
1649 the library). Particularly appealing opportunities for the sake of
1650 iostream performance are for copy and find applied to streambuf
1651 iterators or (as noted elsewhere) for staged iterators, of which
1652 the streambuf iterators are a good example.
1654 The bsearch and qsort functions cannot be overloaded properly as
1655 required by the standard because gcc does not yet allow overloading
1656 on the extern-"C"-ness of a function pointer.
1659 --------------------
1660 Headers: <complex> <valarray> <numeric>
1661 C headers: <cmath>, <cstdlib> (also 18, 21, 25)
1663 Numeric components: Gabriel dos Reis's valarray, Drepper's complex,
1664 and the few algorithms from the STL are "mostly done". Of course
1665 optimization opportunities abound for the numerically literate. It
1666 is not clear whether the valarray implementation really conforms
1667 fully, in the assumptions it makes about aliasing (and lack thereof)
1670 The C div() and ldiv() functions are interesting, because they are the
1671 only case where a C library function returns a class object by value.
1672 Since the C++ type div_t must be different from the underlying C type
1673 (which is in the wrong namespace) the underlying functions div() and
1674 ldiv() cannot be re-used efficiently. Fortunately they are trivial to
1677 Chapter 27 Iostreams
1678 ---------------------
1679 Headers: <iosfwd> <streambuf> <ios> <ostream> <istream> <iostream>
1680 <iomanip> <sstream> <fstream>
1681 C headers: <cstdio> <cwchar> (also in 21)
1683 Iostream is currently in a very incomplete state. <iosfwd>, <iomanip>,
1684 ios_base, and basic_ios<> are "mostly complete". basic_streambuf<> and
1685 basic_ostream<> are well along, but basic_istream<> has had little work
1686 done. The standard stream objects, <sstream> and <fstream> have been
1687 started; basic_filebuf<> "write" functions have been implemented just
1688 enough to do "hello, world".
1690 Most of the istream and ostream operators << and >> (with the exception
1691 of the op<<(integer) ones) have not been changed to use locale primitives,
1692 sentry objects, or char_traits members.
1694 All these templates should be manually instantiated for char and
1695 wchar_t in a way that links only used members into user programs.
1697 Streambuf is fertile ground for optimization extensions. An extended
1698 interface giving iterator access to its internal buffer would be very
1699 useful for other library components.
1701 Iostream operations (primarily operators << and >>) can take advantage
1702 of the case where user code has not specified a locale, and bypass locale
1703 operations entirely. The current implementation of op<</num_put<>::put,
1704 for the integer types, demonstrates how they can cache encoding details
1705 from the locale on each operation. There is lots more room for
1706 optimization in this area.
1708 The definition of the relationship between the standard streams
1709 cout et al. and stdout et al. requires something like a "stdiobuf".
1710 The SGI solution of using double-indirection to actually use a
1711 stdio FILE object for buffering is unsatisfactory, because it
1712 interferes with peephole loop optimizations.
1714 The <sstream> header work has begun. stringbuf can benefit from
1715 friendship with basic_string<> and basic_string<>::_Rep to use
1716 those objects directly as buffers, and avoid allocating and making
1719 The basic_filebuf<> template is a complex beast. It is specified to
1720 use the locale facet codecvt<> to translate characters between native
1721 files and the locale character encoding. In general this involves
1722 two buffers, one of "char" representing the file and another of
1723 "char_type", for the stream, with codecvt<> translating. The process
1724 is complicated by the variable-length nature of the translation, and
1725 the need to seek to corresponding places in the two representations.
1726 For the case of basic_filebuf<char>, when no translation is needed,
1727 a single buffer suffices. A specialized filebuf can be used to reduce
1728 code space overhead when no locale has been imbued. Matt Austern's
1729 work at SGI will be useful, perhaps directly as a source of code, or
1730 at least as an example to draw on.
1732 Filebuf, almost uniquely (cf. operator new), depends heavily on
1733 underlying environmental facilities. In current releases iostream
1734 depends fairly heavily on libio constant definitions, but it should
1735 be made independent. It also depends on operating system primitives
1736 for file operations. There is immense room for optimizations using
1737 (e.g.) mmap for reading. The shadow/ directory wraps, besides the
1738 standard C headers, the libio.h and unistd.h headers, for use mainly
1739 by filebuf. These wrappings have not been completed, though there
1740 is scaffolding in place.
1742 The encapsulation of certain C header <cstdio> names presents an
1743 interesting problem. It is possible to define an inline std::fprintf()
1744 implemented in terms of the 'extern "C"' vfprintf(), but there is no
1745 standard vfscanf() to use to implement std::fscanf(). It appears that
1746 vfscanf but be re-implemented in C++ for targets where no vfscanf
1747 extension has been defined. This is interesting in that it seems
1748 to be the only significant case in the C library where this kind of
1749 rewriting is necessary. (Of course Glibc provides the vfscanf()
1750 extension.) (The functions related to exit() must be rewritten
1756 Headers: <strstream>
1758 Annex D defines many non-library features, and many minor
1759 modifications to various headers, and a complete header.
1760 It is "mostly done", except that the libstdc++-2 <strstream>
1761 header has not been adopted into the library, or checked to
1762 verify that it matches the draft in those details that were
1763 clarified by the committee. Certainly it must at least be
1764 moved into the std namespace.
1766 We still need to wrap all the deprecated features in #if guards
1767 so that pedantic compile modes can detect their use.
1769 Nonstandard Extensions
1770 ----------------------
1771 Headers: <iostream.h> <strstream.h> <hash> <rbtree>
1772 <pthread_alloc> <stdiobuf> (etc.)
1774 User code has come to depend on a variety of nonstandard components
1775 that we must not omit. Much of this code can be adopted from
1776 libstdc++-v2 or from the SGI STL. This particularly includes
1777 <iostream.h>, <strstream.h>, and various SGI extensions such
1778 as <hash_map.h>. Many of these are already placed in the
1779 subdirectories ext/ and backward/. (Note that it is better to
1780 include them via "<backward/hash_map.h>" or "<ext/hash_map>" than
1781 to search the subdirectory itself via a "-I" directive.