| Index: gcc/libstdc++-v3/doc/xml/manual/appendix_contributing.xml
|
| diff --git a/gcc/libstdc++-v3/doc/xml/manual/appendix_contributing.xml b/gcc/libstdc++-v3/doc/xml/manual/appendix_contributing.xml
|
| deleted file mode 100644
|
| index 1688fa823a1cc56357e0bef8cbe41295607f9fb6..0000000000000000000000000000000000000000
|
| --- a/gcc/libstdc++-v3/doc/xml/manual/appendix_contributing.xml
|
| +++ /dev/null
|
| @@ -1,2250 +0,0 @@
|
| -<?xml version='1.0'?>
|
| -<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
| - "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
|
| -[ ]>
|
| -
|
| -<appendix id="appendix.contrib" xreflabel="Contributing">
|
| -<?dbhtml filename="appendix_contributing.html"?>
|
| -
|
| -<appendixinfo>
|
| - <keywordset>
|
| - <keyword>
|
| - ISO C++
|
| - </keyword>
|
| - <keyword>
|
| - library
|
| - </keyword>
|
| - </keywordset>
|
| -</appendixinfo>
|
| -
|
| -<title>
|
| - Contributing
|
| - <indexterm>
|
| - <primary>Appendix</primary>
|
| - <secondary>Contributing</secondary>
|
| - </indexterm>
|
| -</title>
|
| -
|
| -<para>
|
| - The GNU C++ Library follows an open development model. Active
|
| - contributors are assigned maintainer-ship responsibility, and given
|
| - write access to the source repository. First time contributors
|
| - should follow this procedure:
|
| -</para>
|
| -
|
| -<sect1 id="contrib.list" xreflabel="Contributor Checklist">
|
| - <title>Contributor Checklist</title>
|
| -
|
| - <sect2 id="list.reading" xreflabel="list.reading">
|
| - <title>Reading</title>
|
| -
|
| - <itemizedlist>
|
| - <listitem>
|
| - <para>
|
| - Get and read the relevant sections of the C++ language
|
| - specification. Copies of the full ISO 14882 standard are
|
| - available on line via the ISO mirror site for committee
|
| - members. Non-members, or those who have not paid for the
|
| - privilege of sitting on the committee and sustained their
|
| - two meeting commitment for voting rights, may get a copy of
|
| - the standard from their respective national standards
|
| - organization. In the USA, this national standards
|
| - organization is ANSI and their web-site is right
|
| - <ulink url="http://www.ansi.org">here.</ulink>
|
| - (And if you've already registered with them, clicking this link will take you to directly to the place where you can
|
| - <ulink url="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003">buy the standard on-line.)</ulink>
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - The library working group bugs, and known defects, can
|
| - be obtained here:
|
| - <ulink url="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21 </ulink>
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - The newsgroup dedicated to standardization issues is
|
| - comp.std.c++: this FAQ for this group is quite useful and
|
| - can be
|
| - found <ulink url="http://www.jamesd.demon.co.uk/csc/faq.html">
|
| - here </ulink>.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - Peruse
|
| - the <ulink url="http://www.gnu.org/prep/standards_toc.html">GNU
|
| - Coding Standards</ulink>, and chuckle when you hit the part
|
| - about <quote>Using Languages Other Than C</quote>.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - Be familiar with the extensions that preceded these
|
| - general GNU rules. These style issues for libstdc++ can be
|
| - found <link linkend="contrib.coding_style">here</link>.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - And last but certainly not least, read the
|
| - library-specific information
|
| - found <link linkend="appendix.porting"> here</link>.
|
| - </para>
|
| - </listitem>
|
| - </itemizedlist>
|
| -
|
| - </sect2>
|
| - <sect2 id="list.copyright" xreflabel="list.copyright">
|
| - <title>Assignment</title>
|
| - <para>
|
| - Small changes can be accepted without a copyright assignment form on
|
| - file. New code and additions to the library need completed copyright
|
| - assignment form on file at the FSF. Note: your employer may be required
|
| - to fill out appropriate disclaimer forms as well.
|
| - </para>
|
| -
|
| - <para>
|
| - Historically, the libstdc++ assignment form added the following
|
| - question:
|
| - </para>
|
| -
|
| - <para>
|
| - <quote>
|
| - Which Belgian comic book character is better, Tintin or Asterix, and
|
| - why?
|
| - </quote>
|
| - </para>
|
| -
|
| - <para>
|
| - While not strictly necessary, humoring the maintainers and answering
|
| - this question would be appreciated.
|
| - </para>
|
| -
|
| - <para>
|
| - For more information about getting a copyright assignment, please see
|
| - <ulink url="http://www.gnu.org/prep/maintain/html_node/Legal-Matters.html">Legal
|
| - Matters</ulink>.
|
| - </para>
|
| -
|
| - <para>
|
| - Please contact Benjamin Kosnik at
|
| - <email>bkoz+assign@redhat.com</email> if you are confused
|
| - about the assignment or have general licensing questions. When
|
| - requesting an assignment form from
|
| - <email>mailto:assign@gnu.org</email>, please cc the libstdc++
|
| - maintainer above so that progress can be monitored.
|
| - </para>
|
| - </sect2>
|
| -
|
| - <sect2 id="list.getting" xreflabel="list.getting">
|
| - <title>Getting Sources</title>
|
| - <para>
|
| - <ulink url="http://gcc.gnu.org/svnwrite.html">Getting write access
|
| - (look for "Write after approval")</ulink>
|
| - </para>
|
| - </sect2>
|
| -
|
| - <sect2 id="list.patches" xreflabel="list.patches">
|
| - <title>Submitting Patches</title>
|
| -
|
| - <para>
|
| - Every patch must have several pieces of information before it can be
|
| - properly evaluated. Ideally (and to ensure the fastest possible
|
| - response from the maintainers) it would have all of these pieces:
|
| - </para>
|
| -
|
| - <itemizedlist>
|
| - <listitem>
|
| - <para>
|
| - A description of the bug and how your patch fixes this
|
| - bug. For new features a description of the feature and your
|
| - implementation.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - A ChangeLog entry as plain text; see the various
|
| - ChangeLog files for format and content. If using you are
|
| - using emacs as your editor, simply position the insertion
|
| - point at the beginning of your change and hit CX-4a to bring
|
| - up the appropriate ChangeLog entry. See--magic! Similar
|
| - functionality also exists for vi.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - A testsuite submission or sample program that will
|
| - easily and simply show the existing error or test new
|
| - functionality.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - The patch itself. If you are accessing the SVN
|
| - repository use <command>svn update; svn diff NEW</command>;
|
| - else, use <command>diff -cp OLD NEW</command> ... If your
|
| - version of diff does not support these options, then get the
|
| - latest version of GNU
|
| - diff. The <ulink url="http://gcc.gnu.org/wiki/SvnTricks">SVN
|
| - Tricks</ulink> wiki page has information on customising the
|
| - output of <code>svn diff</code>.
|
| - </para>
|
| - </listitem>
|
| -
|
| - <listitem>
|
| - <para>
|
| - When you have all these pieces, bundle them up in a
|
| - mail message and send it to libstdc++@gcc.gnu.org. All
|
| - patches and related discussion should be sent to the
|
| - libstdc++ mailing list.
|
| - </para>
|
| - </listitem>
|
| - </itemizedlist>
|
| -
|
| - </sect2>
|
| -
|
| -</sect1>
|
| -
|
| -<sect1 id="contrib.organization" xreflabel="Source Organization">
|
| - <?dbhtml filename="source_organization.html"?>
|
| - <title>Directory Layout and Source Conventions</title>
|
| -
|
| - <para>
|
| - The unpacked source directory of libstdc++ contains the files
|
| - needed to create the GNU C++ Library.
|
| - </para>
|
| -
|
| - <literallayout>
|
| -It has subdirectories:
|
| -
|
| - doc
|
| - Files in HTML and text format that document usage, quirks of the
|
| - implementation, and contributor checklists.
|
| -
|
| - include
|
| - All header files for the C++ library are within this directory,
|
| - modulo specific runtime-related files that are in the libsupc++
|
| - directory.
|
| -
|
| - include/std
|
| - Files meant to be found by #include <name> directives in
|
| - standard-conforming user programs.
|
| -
|
| - include/c
|
| - Headers intended to directly include standard C headers.
|
| - [NB: this can be enabled via --enable-cheaders=c]
|
| -
|
| - include/c_global
|
| - Headers intended to include standard C headers in
|
| - the global namespace, and put select names into the std::
|
| - namespace. [NB: this is the default, and is the same as
|
| - --enable-cheaders=c_global]
|
| -
|
| - include/c_std
|
| - Headers intended to include standard C headers
|
| - already in namespace std, and put select names into the std::
|
| - namespace. [NB: this is the same as --enable-cheaders=c_std]
|
| -
|
| - include/bits
|
| - Files included by standard headers and by other files in
|
| - the bits directory.
|
| -
|
| - include/backward
|
| - Headers provided for backward compatibility, such as <iostream.h>.
|
| - They are not used in this library.
|
| -
|
| - include/ext
|
| - Headers that define extensions to the standard library. No
|
| - standard header refers to any of them.
|
| -
|
| - scripts
|
| - Scripts that are used during the configure, build, make, or test
|
| - process.
|
| -
|
| - src
|
| - Files that are used in constructing the library, but are not
|
| - installed.
|
| -
|
| - testsuites/[backward, demangle, ext, performance, thread, 17_* to 27_*]
|
| - Test programs are here, and may be used to begin to exercise the
|
| - library. Support for "make check" and "make check-install" is
|
| - complete, and runs through all the subdirectories here when this
|
| - command is issued from the build directory. Please note that
|
| - "make check" requires DejaGNU 1.4 or later to be installed. Please
|
| - note that "make check-script" calls the script mkcheck, which
|
| - requires bash, and which may need the paths to bash adjusted to
|
| - work properly, as /bin/bash is assumed.
|
| -
|
| -Other subdirectories contain variant versions of certain files
|
| -that are meant to be copied or linked by the configure script.
|
| -Currently these are:
|
| -
|
| - config/abi
|
| - config/cpu
|
| - config/io
|
| - config/locale
|
| - config/os
|
| -
|
| -In addition, a subdirectory holds the convenience library libsupc++.
|
| -
|
| - libsupc++
|
| - Contains the runtime library for C++, including exception
|
| - handling and memory allocation and deallocation, RTTI, terminate
|
| - handlers, etc.
|
| -
|
| -Note that glibc also has a bits/ subdirectory. We will either
|
| -need to be careful not to collide with names in its bits/
|
| -directory; or rename bits to (e.g.) cppbits/.
|
| -
|
| -In files throughout the system, lines marked with an "XXX" indicate
|
| -a bug or incompletely-implemented feature. Lines marked "XXX MT"
|
| -indicate a place that may require attention for multi-thread safety.
|
| - </literallayout>
|
| -
|
| -</sect1>
|
| -
|
| -<sect1 id="contrib.coding_style" xreflabel="Coding Style">
|
| - <?dbhtml filename="source_code_style.html"?>
|
| - <title>Coding Style</title>
|
| - <para>
|
| - </para>
|
| - <sect2 id="coding_style.bad_identifiers" xreflabel="coding_style.bad">
|
| - <title>Bad Identifiers</title>
|
| - <para>
|
| - Identifiers that conflict and should be avoided.
|
| - </para>
|
| -
|
| - <literallayout>
|
| - This is the list of names <quote>reserved to the
|
| - implementation</quote> that have been claimed by certain
|
| - compilers and system headers of interest, and should not be used
|
| - in the library. It will grow, of course. We generally are
|
| - interested in names that are not all-caps, except for those like
|
| - "_T"
|
| -
|
| - For Solaris:
|
| - _B
|
| - _C
|
| - _L
|
| - _N
|
| - _P
|
| - _S
|
| - _U
|
| - _X
|
| - _E1
|
| - ..
|
| - _E24
|
| -
|
| - Irix adds:
|
| - _A
|
| - _G
|
| -
|
| - MS adds:
|
| - _T
|
| -
|
| - BSD adds:
|
| - __used
|
| - __unused
|
| - __inline
|
| - _Complex
|
| - __istype
|
| - __maskrune
|
| - __tolower
|
| - __toupper
|
| - __wchar_t
|
| - __wint_t
|
| - _res
|
| - _res_ext
|
| - __tg_*
|
| -
|
| - SPU adds:
|
| - __ea
|
| -
|
| - For GCC:
|
| -
|
| - [Note that this list is out of date. It applies to the old
|
| - name-mangling; in G++ 3.0 and higher a different name-mangling is
|
| - used. In addition, many of the bugs relating to G++ interpreting
|
| - these names as operators have been fixed.]
|
| -
|
| - The full set of __* identifiers (combined from gcc/cp/lex.c and
|
| - gcc/cplus-dem.c) that are either old or new, but are definitely
|
| - recognized by the demangler, is:
|
| -
|
| - __aa
|
| - __aad
|
| - __ad
|
| - __addr
|
| - __adv
|
| - __aer
|
| - __als
|
| - __alshift
|
| - __amd
|
| - __ami
|
| - __aml
|
| - __amu
|
| - __aor
|
| - __apl
|
| - __array
|
| - __ars
|
| - __arshift
|
| - __as
|
| - __bit_and
|
| - __bit_ior
|
| - __bit_not
|
| - __bit_xor
|
| - __call
|
| - __cl
|
| - __cm
|
| - __cn
|
| - __co
|
| - __component
|
| - __compound
|
| - __cond
|
| - __convert
|
| - __delete
|
| - __dl
|
| - __dv
|
| - __eq
|
| - __er
|
| - __ge
|
| - __gt
|
| - __indirect
|
| - __le
|
| - __ls
|
| - __lt
|
| - __max
|
| - __md
|
| - __method_call
|
| - __mi
|
| - __min
|
| - __minus
|
| - __ml
|
| - __mm
|
| - __mn
|
| - __mult
|
| - __mx
|
| - __ne
|
| - __negate
|
| - __new
|
| - __nop
|
| - __nt
|
| - __nw
|
| - __oo
|
| - __op
|
| - __or
|
| - __pl
|
| - __plus
|
| - __postdecrement
|
| - __postincrement
|
| - __pp
|
| - __pt
|
| - __rf
|
| - __rm
|
| - __rs
|
| - __sz
|
| - __trunc_div
|
| - __trunc_mod
|
| - __truth_andif
|
| - __truth_not
|
| - __truth_orif
|
| - __vc
|
| - __vd
|
| - __vn
|
| -
|
| - SGI badnames:
|
| - __builtin_alloca
|
| - __builtin_fsqrt
|
| - __builtin_sqrt
|
| - __builtin_fabs
|
| - __builtin_dabs
|
| - __builtin_cast_f2i
|
| - __builtin_cast_i2f
|
| - __builtin_cast_d2ll
|
| - __builtin_cast_ll2d
|
| - __builtin_copy_dhi2i
|
| - __builtin_copy_i2dhi
|
| - __builtin_copy_dlo2i
|
| - __builtin_copy_i2dlo
|
| - __add_and_fetch
|
| - __sub_and_fetch
|
| - __or_and_fetch
|
| - __xor_and_fetch
|
| - __and_and_fetch
|
| - __nand_and_fetch
|
| - __mpy_and_fetch
|
| - __min_and_fetch
|
| - __max_and_fetch
|
| - __fetch_and_add
|
| - __fetch_and_sub
|
| - __fetch_and_or
|
| - __fetch_and_xor
|
| - __fetch_and_and
|
| - __fetch_and_nand
|
| - __fetch_and_mpy
|
| - __fetch_and_min
|
| - __fetch_and_max
|
| - __lock_test_and_set
|
| - __lock_release
|
| - __lock_acquire
|
| - __compare_and_swap
|
| - __synchronize
|
| - __high_multiply
|
| - __unix
|
| - __sgi
|
| - __linux__
|
| - __i386__
|
| - __i486__
|
| - __cplusplus
|
| - __embedded_cplusplus
|
| - // long double conversion members mangled as __opr
|
| - // http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html
|
| - _opr
|
| - </literallayout>
|
| - </sect2>
|
| -
|
| - <sect2 id="coding_style.example" xreflabel="coding_style.example">
|
| - <title>By Example</title>
|
| - <literallayout>
|
| - This library is written to appropriate C++ coding standards. As such,
|
| - it is intended to precede the recommendations of the GNU Coding
|
| - Standard, which can be referenced in full here:
|
| -
|
| - http://www.gnu.org/prep/standards/standards.html#Formatting
|
| -
|
| - The rest of this is also interesting reading, but skip the "Design
|
| - Advice" part.
|
| -
|
| - The GCC coding conventions are here, and are also useful:
|
| - http://gcc.gnu.org/codingconventions.html
|
| -
|
| - In addition, because it doesn't seem to be stated explicitly anywhere
|
| - else, there is an 80 column source limit.
|
| -
|
| - ChangeLog entries for member functions should use the
|
| - classname::member function name syntax as follows:
|
| -
|
| - 1999-04-15 Dennis Ritchie <dr@att.com>
|
| -
|
| - * src/basic_file.cc (__basic_file::open): Fix thinko in
|
| - _G_HAVE_IO_FILE_OPEN bits.
|
| -
|
| - Notable areas of divergence from what may be previous local practice
|
| - (particularly for GNU C) include:
|
| -
|
| - 01. Pointers and references
|
| - char* p = "flop";
|
| - char& c = *p;
|
| - -NOT-
|
| - char *p = "flop"; // wrong
|
| - char &c = *p; // wrong
|
| -
|
| - Reason: In C++, definitions are mixed with executable code. Here,
|
| - p is being initialized, not *p. This is near-universal
|
| - practice among C++ programmers; it is normal for C hackers
|
| - to switch spontaneously as they gain experience.
|
| -
|
| - 02. Operator names and parentheses
|
| - operator==(type)
|
| - -NOT-
|
| - operator == (type) // wrong
|
| -
|
| - Reason: The == is part of the function name. Separating
|
| - it makes the declaration look like an expression.
|
| -
|
| - 03. Function names and parentheses
|
| - void mangle()
|
| - -NOT-
|
| - void mangle () // wrong
|
| -
|
| - Reason: no space before parentheses (except after a control-flow
|
| - keyword) is near-universal practice for C++. It identifies the
|
| - parentheses as the function-call operator or declarator, as
|
| - opposed to an expression or other overloaded use of parentheses.
|
| -
|
| - 04. Template function indentation
|
| - template<typename T>
|
| - void
|
| - template_function(args)
|
| - { }
|
| - -NOT-
|
| - template<class T>
|
| - void template_function(args) {};
|
| -
|
| - Reason: In class definitions, without indentation whitespace is
|
| - needed both above and below the declaration to distinguish
|
| - it visually from other members. (Also, re: "typename"
|
| - rather than "class".) T often could be int, which is
|
| - not a class. ("class", here, is an anachronism.)
|
| -
|
| - 05. Template class indentation
|
| - template<typename _CharT, typename _Traits>
|
| - class basic_ios : public ios_base
|
| - {
|
| - public:
|
| - // Types:
|
| - };
|
| - -NOT-
|
| - template<class _CharT, class _Traits>
|
| - class basic_ios : public ios_base
|
| - {
|
| - public:
|
| - // Types:
|
| - };
|
| - -NOT-
|
| - template<class _CharT, class _Traits>
|
| - class basic_ios : public ios_base
|
| - {
|
| - public:
|
| - // Types:
|
| - };
|
| -
|
| - 06. Enumerators
|
| - enum
|
| - {
|
| - space = _ISspace,
|
| - print = _ISprint,
|
| - cntrl = _IScntrl
|
| - };
|
| - -NOT-
|
| - enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };
|
| -
|
| - 07. Member initialization lists
|
| - All one line, separate from class name.
|
| -
|
| - gribble::gribble()
|
| - : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
|
| - { }
|
| - -NOT-
|
| - gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
|
| - { }
|
| -
|
| - 08. Try/Catch blocks
|
| - try
|
| - {
|
| - //
|
| - }
|
| - catch (...)
|
| - {
|
| - //
|
| - }
|
| - -NOT-
|
| - try {
|
| - //
|
| - } catch(...) {
|
| - //
|
| - }
|
| -
|
| - 09. Member functions declarations and definitions
|
| - Keywords such as extern, static, export, explicit, inline, etc
|
| - go on the line above the function name. Thus
|
| -
|
| - virtual int
|
| - foo()
|
| - -NOT-
|
| - virtual int foo()
|
| -
|
| - Reason: GNU coding conventions dictate return types for functions
|
| - are on a separate line than the function name and parameter list
|
| - for definitions. For C++, where we have member functions that can
|
| - be either inline definitions or declarations, keeping to this
|
| - standard allows all member function names for a given class to be
|
| - aligned to the same margin, increasing readability.
|
| -
|
| -
|
| - 10. Invocation of member functions with "this->"
|
| - For non-uglified names, use this->name to call the function.
|
| -
|
| - this->sync()
|
| - -NOT-
|
| - sync()
|
| -
|
| - Reason: Koenig lookup.
|
| -
|
| - 11. Namespaces
|
| - namespace std
|
| - {
|
| - blah blah blah;
|
| - } // namespace std
|
| -
|
| - -NOT-
|
| -
|
| - namespace std {
|
| - blah blah blah;
|
| - } // namespace std
|
| -
|
| - 12. Spacing under protected and private in class declarations:
|
| - space above, none below
|
| - i.e.
|
| -
|
| - public:
|
| - int foo;
|
| -
|
| - -NOT-
|
| - public:
|
| -
|
| - int foo;
|
| -
|
| - 13. Spacing WRT return statements.
|
| - no extra spacing before returns, no parenthesis
|
| - i.e.
|
| -
|
| - }
|
| - return __ret;
|
| -
|
| - -NOT-
|
| - }
|
| -
|
| - return __ret;
|
| -
|
| - -NOT-
|
| -
|
| - }
|
| - return (__ret);
|
| -
|
| -
|
| - 14. Location of global variables.
|
| - All global variables of class type, whether in the "user visible"
|
| - space (e.g., cin) or the implementation namespace, must be defined
|
| - as a character array with the appropriate alignment and then later
|
| - re-initialized to the correct value.
|
| -
|
| - This is due to startup issues on certain platforms, such as AIX.
|
| - For more explanation and examples, see src/globals.cc. All such
|
| - variables should be contained in that file, for simplicity.
|
| -
|
| - 15. Exception abstractions
|
| - Use the exception abstractions found in functexcept.h, which allow
|
| - C++ programmers to use this library with -fno-exceptions. (Even if
|
| - that is rarely advisable, it's a necessary evil for backwards
|
| - compatibility.)
|
| -
|
| - 16. Exception error messages
|
| - All start with the name of the function where the exception is
|
| - thrown, and then (optional) descriptive text is added. Example:
|
| -
|
| - __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
|
| -
|
| - Reason: The verbose terminate handler prints out exception::what(),
|
| - as well as the typeinfo for the thrown exception. As this is the
|
| - default terminate handler, by putting location info into the
|
| - exception string, a very useful error message is printed out for
|
| - uncaught exceptions. So useful, in fact, that non-programmers can
|
| - give useful error messages, and programmers can intelligently
|
| - speculate what went wrong without even using a debugger.
|
| -
|
| - 17. The doxygen style guide to comments is a separate document,
|
| - see index.
|
| -
|
| - The library currently has a mixture of GNU-C and modern C++ coding
|
| - styles. The GNU C usages will be combed out gradually.
|
| -
|
| - Name patterns:
|
| -
|
| - For nonstandard names appearing in Standard headers, we are constrained
|
| - to use names that begin with underscores. This is called "uglification".
|
| - The convention is:
|
| -
|
| - Local and argument names: __[a-z].*
|
| -
|
| - Examples: __count __ix __s1
|
| -
|
| - Type names and template formal-argument names: _[A-Z][^_].*
|
| -
|
| - Examples: _Helper _CharT _N
|
| -
|
| - Member data and function names: _M_.*
|
| -
|
| - Examples: _M_num_elements _M_initialize ()
|
| -
|
| - Static data members, constants, and enumerations: _S_.*
|
| -
|
| - Examples: _S_max_elements _S_default_value
|
| -
|
| - Don't use names in the same scope that differ only in the prefix,
|
| - e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names.
|
| - (The most tempting of these seem to be and "_T" and "__sz".)
|
| -
|
| - Names must never have "__" internally; it would confuse name
|
| - unmanglers on some targets. Also, never use "__[0-9]", same reason.
|
| -
|
| - --------------------------
|
| -
|
| - [BY EXAMPLE]
|
| -
|
| - #ifndef _HEADER_
|
| - #define _HEADER_ 1
|
| -
|
| - namespace std
|
| - {
|
| - class gribble
|
| - {
|
| - public:
|
| - gribble() throw();
|
| -
|
| - gribble(const gribble&);
|
| -
|
| - explicit
|
| - gribble(int __howmany);
|
| -
|
| - gribble&
|
| - operator=(const gribble&);
|
| -
|
| - virtual
|
| - ~gribble() throw ();
|
| -
|
| - // Start with a capital letter, end with a period.
|
| - inline void
|
| - public_member(const char* __arg) const;
|
| -
|
| - // In-class function definitions should be restricted to one-liners.
|
| - int
|
| - one_line() { return 0 }
|
| -
|
| - int
|
| - two_lines(const char* arg)
|
| - { return strchr(arg, 'a'); }
|
| -
|
| - inline int
|
| - three_lines(); // inline, but defined below.
|
| -
|
| - // Note indentation.
|
| - template<typename _Formal_argument>
|
| - void
|
| - public_template() const throw();
|
| -
|
| - template<typename _Iterator>
|
| - void
|
| - other_template();
|
| -
|
| - private:
|
| - class _Helper;
|
| -
|
| - int _M_private_data;
|
| - int _M_more_stuff;
|
| - _Helper* _M_helper;
|
| - int _M_private_function();
|
| -
|
| - enum _Enum
|
| - {
|
| - _S_one,
|
| - _S_two
|
| - };
|
| -
|
| - static void
|
| - _S_initialize_library();
|
| - };
|
| -
|
| - // More-or-less-standard language features described by lack, not presence.
|
| - # ifndef _G_NO_LONGLONG
|
| - extern long long _G_global_with_a_good_long_name; // avoid globals!
|
| - # endif
|
| -
|
| - // Avoid in-class inline definitions, define separately;
|
| - // likewise for member class definitions:
|
| - inline int
|
| - gribble::public_member() const
|
| - { int __local = 0; return __local; }
|
| -
|
| - class gribble::_Helper
|
| - {
|
| - int _M_stuff;
|
| -
|
| - friend class gribble;
|
| - };
|
| - }
|
| -
|
| - // Names beginning with "__": only for arguments and
|
| - // local variables; never use "__" in a type name, or
|
| - // within any name; never use "__[0-9]".
|
| -
|
| - #endif /* _HEADER_ */
|
| -
|
| -
|
| - namespace std
|
| - {
|
| - template<typename T> // notice: "typename", not "class", no space
|
| - long_return_value_type<with_many, args>
|
| - function_name(char* pointer, // "char *pointer" is wrong.
|
| - char* argument,
|
| - const Reference& ref)
|
| - {
|
| - // int a_local; /* wrong; see below. */
|
| - if (test)
|
| - {
|
| - nested code
|
| - }
|
| -
|
| - int a_local = 0; // declare variable at first use.
|
| -
|
| - // char a, b, *p; /* wrong */
|
| - char a = 'a';
|
| - char b = a + 1;
|
| - char* c = "abc"; // each variable goes on its own line, always.
|
| -
|
| - // except maybe here...
|
| - for (unsigned i = 0, mask = 1; mask; ++i, mask <<= 1) {
|
| - // ...
|
| - }
|
| - }
|
| -
|
| - gribble::gribble()
|
| - : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
|
| - { }
|
| -
|
| - inline int
|
| - gribble::three_lines()
|
| - {
|
| - // doesn't fit in one line.
|
| - }
|
| - } // namespace std
|
| - </literallayout>
|
| - </sect2>
|
| -</sect1>
|
| -
|
| -<sect1 id="contrib.doc_style" xreflabel="Documentation Style">
|
| - <?dbhtml filename="documentation_style.html"?>
|
| - <title>Documentation Style</title>
|
| - <sect2 id="doc_style.doxygen" xreflabel="doc_style.doxygen">
|
| - <title>Doxygen</title>
|
| - <sect3 id="doxygen.prereq" xreflabel="doxygen.prereq">
|
| - <title>Prerequisites</title>
|
| - <para>
|
| - Prerequisite tools are Bash 2.x,
|
| - <ulink url="http://www.doxygen.org/">Doxygen</ulink>, and
|
| - the <ulink url="http://www.gnu.org/software/coreutils/">GNU
|
| - coreutils</ulink>. (GNU versions of find, xargs, and possibly
|
| - sed and grep are used, just because the GNU versions make
|
| - things very easy.)
|
| - </para>
|
| -
|
| - <para>
|
| - To generate the pretty pictures and hierarchy
|
| - graphs, the
|
| - <ulink url="http://www.research.att.com/sw/tools/graphviz/download.html">Graphviz</ulink>
|
| - package will need to be installed.
|
| - </para>
|
| - </sect3>
|
| -
|
| - <sect3 id="doxygen.rules" xreflabel="doxygen.rules">
|
| - <title>Generating the Doxygen Files</title>
|
| - <para>
|
| - The following Makefile rules run Doxygen to generate HTML
|
| - docs, XML docs, and the man pages.
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-html-doxygen</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-xml-doxygen</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-man-doxygen</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - Careful observers will see that the Makefile rules simply call
|
| - a script from the source tree, <filename>run_doxygen</filename>, which
|
| - does the actual work of running Doxygen and then (most
|
| - importantly) massaging the output files. If for some reason
|
| - you prefer to not go through the Makefile, you can call this
|
| - script directly. (Start by passing <literal>--help</literal>.)
|
| - </para>
|
| -
|
| - <para>
|
| - If you wish to tweak the Doxygen settings, do so by editing
|
| - <filename>doc/doxygen/user.cfg.in</filename>. Notes to fellow
|
| - library hackers are written in triple-# comments.
|
| - </para>
|
| -
|
| - </sect3>
|
| -
|
| - <sect3 id="doxygen.markup" xreflabel="doxygen.markup">
|
| - <title>Markup</title>
|
| -
|
| - <para>
|
| - In general, libstdc++ files should be formatted according to
|
| - the rules found in the
|
| - <link linkend="contrib.coding_style">Coding Standard</link>. Before
|
| - any doxygen-specific formatting tweaks are made, please try to
|
| - make sure that the initial formatting is sound.
|
| - </para>
|
| -
|
| - <para>
|
| - Adding Doxygen markup to a file (informally called
|
| - <quote>doxygenating</quote>) is very simple. The Doxygen manual can be
|
| - found
|
| - <ulink url="http://www.stack.nl/~dimitri/doxygen/download.html#latestman">here</ulink>.
|
| - We try to use a very-recent version of Doxygen.
|
| - </para>
|
| -
|
| - <para>
|
| - For classes, use
|
| - <classname>deque</classname>/<classname>vector</classname>/<classname>list</classname>
|
| - and <classname>std::pair</classname> as examples. For
|
| - functions, see their member functions, and the free functions
|
| - in <filename>stl_algobase.h</filename>. Member functions of
|
| - other container-like types should read similarly to these
|
| - member functions.
|
| - </para>
|
| -
|
| - <para>
|
| - These points accompany the first list in section 3.1 of the
|
| - Doxygen manual:
|
| - </para>
|
| -
|
| - <orderedlist>
|
| - <listitem><para>Use the Javadoc style...</para></listitem>
|
| - <listitem>
|
| - <para>
|
| - ...not the Qt style. The intermediate *'s are preferred.
|
| - </para>
|
| - </listitem>
|
| - <listitem>
|
| - <para>
|
| - Use the triple-slash style only for one-line comments (the
|
| - <quote>brief</quote> mode). Very recent versions of Doxygen permit
|
| - full-mode comments in triple-slash blocks, but the
|
| - formatting still comes out wonky.
|
| - </para>
|
| - </listitem>
|
| - <listitem>
|
| - <para>
|
| - This is disgusting. Don't do this.
|
| - </para>
|
| - </listitem>
|
| - </orderedlist>
|
| -
|
| - <para>
|
| - Use the @-style of commands, not the !-style. Please be
|
| - careful about whitespace in your markup comments. Most of the
|
| - time it doesn't matter; doxygen absorbs most whitespace, and
|
| - both HTML and *roff are agnostic about whitespace. However,
|
| - in <pre> blocks and @code/@endcode sections, spacing can
|
| - have <quote>interesting</quote> effects.
|
| - </para>
|
| -
|
| - <para>
|
| - Use either kind of grouping, as
|
| - appropriate. <filename>doxygroups.cc</filename> exists for this
|
| - purpose. See <filename>stl_iterator.h</filename> for a good example
|
| - of the <quote>other</quote> kind of grouping.
|
| - </para>
|
| -
|
| - <para>
|
| - Please use markup tags like @p and @a when referring to things
|
| - such as the names of function parameters. Use @e for emphasis
|
| - when necessary. Use @c to refer to other standard names.
|
| - (Examples of all these abound in the present code.)
|
| - </para>
|
| -
|
| - </sect3>
|
| -
|
| - </sect2>
|
| -
|
| - <sect2 id="doc_style.docbook" xreflabel="doc_style.docbook">
|
| - <title>Docbook</title>
|
| -
|
| - <sect3 id="docbook.prereq" xreflabel="docbook.prereq">
|
| - <title>Prerequisites</title>
|
| - <para>
|
| - Editing the DocBook sources requires an XML editor. Many
|
| - exist: some notable options
|
| - include <command>emacs</command>, <application>Kate</application>,
|
| - or <application>Conglomerate</application>.
|
| - </para>
|
| -
|
| - <para>
|
| - Some editors support special <quote>XML Validation</quote>
|
| - modes that can validate the file as it is
|
| - produced. Recommended is the <command>nXML Mode</command>
|
| - for <command>emacs</command>.
|
| - </para>
|
| -
|
| - <para>
|
| - Besides an editor, additional DocBook files and XML tools are
|
| - also required.
|
| - </para>
|
| -
|
| - <para>
|
| - Access to the DocBook stylesheets and DTD is required. The
|
| - stylesheets are usually packaged by vendor, in something
|
| - like <filename>docbook-style-xsl</filename>. To exactly match
|
| - generated output, please use a version of the stylesheets
|
| - equivalent
|
| - to <filename>docbook-style-xsl-1.74.0-5</filename>. The
|
| - installation directory for this package corresponds to
|
| - the <literal>XSL_STYLE_DIR</literal>
|
| - in <filename>doc/Makefile.am</filename> and defaults
|
| - to <filename class="directory">/usr/share/sgml/docbook/xsl-stylesheets</filename>.
|
| - </para>
|
| -
|
| - <para>
|
| - For processing XML, an XML processor and some style
|
| - sheets are necessary. Defaults are <command>xsltproc</command>
|
| - provided by <filename>libxslt</filename>.
|
| - </para>
|
| -
|
| - <para>
|
| - For validating the XML document, you'll need
|
| - something like <command>xmllint</command> and access to the
|
| - DocBook DTD. These are provided
|
| - by a vendor package like <filename>libxml2</filename>.
|
| - </para>
|
| -
|
| - <para>
|
| - For PDF output, something that transforms valid XML to PDF is
|
| - required. Possible solutions include <command>xmlto</command>,
|
| - <ulink url="http://xmlgraphics.apache.org/fop/">Apache
|
| - FOP</ulink>, or <command>prince</command>. Other options are
|
| - listed on the DocBook web <ulink
|
| - url="http://wiki.docbook.org/topic/DocBookPublishingTools">pages</ulink>. Please
|
| - consult the <email>libstdc++@gcc.gnu.org</email> list when
|
| - preparing printed manuals for current best practice and suggestions.
|
| - </para>
|
| -
|
| - <para>
|
| - Make sure that the XML documentation and markup is valid for
|
| - any change. This can be done easily, with the validation rules
|
| - in the <filename>Makefile</filename>, which is equivalent to doing:
|
| - </para>
|
| -
|
| - <screen>
|
| - <userinput>
|
| -xmllint --noout --valid <filename>xml/index.xml</filename>
|
| - </userinput>
|
| - </screen>
|
| - </sect3>
|
| -
|
| - <sect3 id="docbook.rules" xreflabel="docbook.rules">
|
| - <title>Generating the DocBook Files</title>
|
| -
|
| - <para>
|
| - The following Makefile rules generate (in order): an HTML
|
| - version of all the documentation, a PDF version of the same, a
|
| - single XML document, and the result of validating the entire XML
|
| - document.
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-html</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-pdf</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-xml-single</userinput></screen>
|
| - </para>
|
| -
|
| - <para>
|
| - <screen><userinput>make doc-xml-validate</userinput></screen>
|
| - </para>
|
| -
|
| - </sect3>
|
| -
|
| - <sect3 id="docbook.examples" xreflabel="docbook.examples">
|
| - <title>File Organization and Basics</title>
|
| -
|
| - <literallayout>
|
| - <emphasis>Which files are important</emphasis>
|
| -
|
| - All Docbook files are in the directory
|
| - libstdc++-v3/doc/xml
|
| -
|
| - Inside this directory, the files of importance:
|
| - spine.xml - index to documentation set
|
| - manual/spine.xml - index to manual
|
| - manual/*.xml - individual chapters and sections of the manual
|
| - faq.xml - index to FAQ
|
| - api.xml - index to source level / API
|
| -
|
| - All *.txml files are template xml files, i.e., otherwise empty files with
|
| - the correct structure, suitable for filling in with new information.
|
| -
|
| - <emphasis>Canonical Writing Style</emphasis>
|
| -
|
| - class template
|
| - function template
|
| - member function template
|
| - (via C++ Templates, Vandevoorde)
|
| -
|
| - class in namespace std: allocator, not std::allocator
|
| -
|
| - header file: iostream, not <iostream>
|
| -
|
| -
|
| - <emphasis>General structure</emphasis>
|
| -
|
| - <set>
|
| - <book>
|
| - </book>
|
| -
|
| - <book>
|
| - <chapter>
|
| - </chapter>
|
| - </book>
|
| -
|
| - <book>
|
| - <part>
|
| - <chapter>
|
| - <section>
|
| - </section>
|
| -
|
| - <sect1>
|
| - </sect1>
|
| -
|
| - <sect1>
|
| - <sect2>
|
| - </sect2>
|
| - </sect1>
|
| - </chapter>
|
| -
|
| - <chapter>
|
| - </chapter>
|
| - </part>
|
| - </book>
|
| -
|
| - </set>
|
| - </literallayout>
|
| - </sect3>
|
| -
|
| - <sect3 id="docbook.markup" xreflabel="docbook.markup">
|
| - <title>Markup By Example</title>
|
| -
|
| -<para>
|
| -Complete details on Docbook markup can be found in the DocBook Element
|
| -Reference, <ulink url="http://www.docbook.org/tdg/en/html/part2.html">online</ulink>. An
|
| -incomplete reference for HTML to Docbook conversion is detailed in the
|
| -table below.
|
| -</para>
|
| -
|
| -<table frame='all'>
|
| -<title>HTML to Docbook XML markup comparison</title>
|
| -<tgroup cols='2' align='left' colsep='1' rowsep='1'>
|
| -<colspec colname='c1'></colspec>
|
| -<colspec colname='c2'></colspec>
|
| -
|
| - <thead>
|
| - <row>
|
| - <entry>HTML</entry>
|
| - <entry>XML</entry>
|
| - </row>
|
| - </thead>
|
| -
|
| - <tbody>
|
| - <row>
|
| - <entry><p></entry>
|
| - <entry><para></entry>
|
| - </row>
|
| - <row>
|
| - <entry><pre></entry>
|
| - <entry><computeroutput>, <programlisting>,
|
| - <literallayout></entry>
|
| - </row>
|
| - <row>
|
| - <entry><ul></entry>
|
| - <entry><itemizedlist></entry>
|
| - </row>
|
| - <row>
|
| - <entry><ol></entry>
|
| - <entry><orderedlist></entry>
|
| - </row>
|
| - <row>
|
| - <entry><il></entry>
|
| - <entry><listitem></entry>
|
| - </row>
|
| - <row>
|
| - <entry><dl></entry>
|
| - <entry><variablelist></entry>
|
| - </row>
|
| - <row>
|
| - <entry><dt></entry>
|
| - <entry><term></entry>
|
| - </row>
|
| - <row>
|
| - <entry><dd></entry>
|
| - <entry><listitem></entry>
|
| - </row>
|
| -
|
| - <row>
|
| - <entry><a href=""></entry>
|
| - <entry><ulink url=""></entry>
|
| - </row>
|
| - <row>
|
| - <entry><code></entry>
|
| - <entry><literal>, <programlisting></entry>
|
| - </row>
|
| - <row>
|
| - <entry><strong></entry>
|
| - <entry><emphasis></entry>
|
| - </row>
|
| - <row>
|
| - <entry><em></entry>
|
| - <entry><emphasis></entry>
|
| - </row>
|
| - <row>
|
| - <entry>"</entry>
|
| - <entry><quote></entry>
|
| - </row>
|
| - </tbody>
|
| -</tgroup>
|
| -</table>
|
| -
|
| -<para>
|
| - And examples of detailed markup for which there are no real HTML
|
| - equivalents are listed in the table below.
|
| -</para>
|
| -
|
| -<table frame='all'>
|
| -<title>Docbook XML Element Use</title>
|
| -<tgroup cols='2' align='left' colsep='1' rowsep='1'>
|
| -<colspec colname='c1'></colspec>
|
| -<colspec colname='c2'></colspec>
|
| -
|
| - <thead>
|
| - <row>
|
| - <entry>Element</entry>
|
| - <entry>Use</entry>
|
| - </row>
|
| - </thead>
|
| -
|
| - <tbody>
|
| - <row>
|
| - <entry><structname></entry>
|
| - <entry><structname>char_traits</structname></entry>
|
| - </row>
|
| - <row>
|
| - <entry><classname></entry>
|
| - <entry><classname>string</classname></entry>
|
| - </row>
|
| - <row>
|
| - <entry><function></entry>
|
| - <entry>
|
| - <para><function>clear()</function></para>
|
| - <para><function>fs.clear()</function></para>
|
| - </entry>
|
| - </row>
|
| - <row>
|
| - <entry><type></entry>
|
| - <entry><type>long long</type></entry>
|
| - </row>
|
| - <row>
|
| - <entry><varname></entry>
|
| - <entry><varname>fs</varname></entry>
|
| - </row>
|
| - <row>
|
| - <entry><literal></entry>
|
| - <entry>
|
| - <para><literal>-Weffc++</literal></para>
|
| - <para><literal>rel_ops</literal></para>
|
| - </entry>
|
| - </row>
|
| - <row>
|
| - <entry><constant></entry>
|
| - <entry>
|
| - <para><constant>_GNU_SOURCE</constant></para>
|
| - <para><constant>3.0</constant></para>
|
| - </entry>
|
| - </row>
|
| - <row>
|
| - <entry><command></entry>
|
| - <entry><command>g++</command></entry>
|
| - </row>
|
| - <row>
|
| - <entry><errortext></entry>
|
| - <entry><errortext>In instantiation of</errortext></entry>
|
| - </row>
|
| - <row>
|
| - <entry><filename></entry>
|
| - <entry>
|
| - <para><filename class="headerfile">ctype.h</filename></para>
|
| - <para><filename class="directory">/home/gcc/build</filename></para>
|
| - </entry>
|
| - </row>
|
| - </tbody>
|
| -</tgroup>
|
| -</table>
|
| -
|
| - </sect3>
|
| - </sect2>
|
| -
|
| -</sect1>
|
| -
|
| -<sect1 id="contrib.design_notes" xreflabel="Design Notes">
|
| - <?dbhtml filename="source_design_notes.html"?>
|
| - <title>Design Notes</title>
|
| - <para>
|
| - </para>
|
| -
|
| - <literallayout>
|
| -
|
| - The Library
|
| - -----------
|
| -
|
| - This paper is covers two major areas:
|
| -
|
| - - Features and policies not mentioned in the standard that
|
| - the quality of the library implementation depends on, including
|
| - extensions and "implementation-defined" features;
|
| -
|
| - - Plans for required but unimplemented library features and
|
| - optimizations to them.
|
| -
|
| - Overhead
|
| - --------
|
| -
|
| - The standard defines a large library, much larger than the standard
|
| - C library. A naive implementation would suffer substantial overhead
|
| - in compile time, executable size, and speed, rendering it unusable
|
| - in many (particularly embedded) applications. The alternative demands
|
| - care in construction, and some compiler support, but there is no
|
| - need for library subsets.
|
| -
|
| - What are the sources of this overhead? There are four main causes:
|
| -
|
| - - The library is specified almost entirely as templates, which
|
| - with current compilers must be included in-line, resulting in
|
| - very slow builds as tens or hundreds of thousands of lines
|
| - of function definitions are read for each user source file.
|
| - Indeed, the entire SGI STL, as well as the dos Reis valarray,
|
| - are provided purely as header files, largely for simplicity in
|
| - porting. Iostream/locale is (or will be) as large again.
|
| -
|
| - - The library is very flexible, specifying a multitude of hooks
|
| - where users can insert their own code in place of defaults.
|
| - When these hooks are not used, any time and code expended to
|
| - support that flexibility is wasted.
|
| -
|
| - - Templates are often described as causing to "code bloat". In
|
| - practice, this refers (when it refers to anything real) to several
|
| - independent processes. First, when a class template is manually
|
| - instantiated in its entirely, current compilers place the definitions
|
| - for all members in a single object file, so that a program linking
|
| - to one member gets definitions of all. Second, template functions
|
| - which do not actually depend on the template argument are, under
|
| - current compilers, generated anew for each instantiation, rather
|
| - than being shared with other instantiations. Third, some of the
|
| - flexibility mentioned above comes from virtual functions (both in
|
| - regular classes and template classes) which current linkers add
|
| - to the executable file even when they manifestly cannot be called.
|
| -
|
| - - The library is specified to use a language feature, exceptions,
|
| - which in the current gcc compiler ABI imposes a run time and
|
| - code space cost to handle the possibility of exceptions even when
|
| - they are not used. Under the new ABI (accessed with -fnew-abi),
|
| - there is a space overhead and a small reduction in code efficiency
|
| - resulting from lost optimization opportunities associated with
|
| - non-local branches associated with exceptions.
|
| -
|
| - What can be done to eliminate this overhead? A variety of coding
|
| - techniques, and compiler, linker and library improvements and
|
| - extensions may be used, as covered below. Most are not difficult,
|
| - and some are already implemented in varying degrees.
|
| -
|
| - Overhead: Compilation Time
|
| - --------------------------
|
| -
|
| - Providing "ready-instantiated" template code in object code archives
|
| - allows us to avoid generating and optimizing template instantiations
|
| - in each compilation unit which uses them. However, the number of such
|
| - instantiations that are useful to provide is limited, and anyway this
|
| - is not enough, by itself, to minimize compilation time. In particular,
|
| - it does not reduce time spent parsing conforming headers.
|
| -
|
| - Quicker header parsing will depend on library extensions and compiler
|
| - improvements. One approach is some variation on the techniques
|
| - previously marketed as "pre-compiled headers", now standardized as
|
| - support for the "export" keyword. "Exported" template definitions
|
| - can be placed (once) in a "repository" -- really just a library, but
|
| - of template definitions rather than object code -- to be drawn upon
|
| - at link time when an instantiation is needed, rather than placed in
|
| - header files to be parsed along with every compilation unit.
|
| -
|
| - Until "export" is implemented we can put some of the lengthy template
|
| - definitions in #if guards or alternative headers so that users can skip
|
| - over the full definitions when they need only the ready-instantiated
|
| - specializations.
|
| -
|
| - To be precise, this means that certain headers which define
|
| - templates which users normally use only for certain arguments
|
| - can be instrumented to avoid exposing the template definitions
|
| - to the compiler unless a macro is defined. For example, in
|
| - <string>, we might have:
|
| -
|
| - template <class _CharT, ... > class basic_string {
|
| - ... // member declarations
|
| - };
|
| - ... // operator declarations
|
| -
|
| - #ifdef _STRICT_ISO_
|
| - # if _G_NO_TEMPLATE_EXPORT
|
| - # include <bits/std_locale.h> // headers needed by definitions
|
| - # ...
|
| - # include <bits/string.tcc> // member and global template definitions.
|
| - # endif
|
| - #endif
|
| -
|
| - Users who compile without specifying a strict-ISO-conforming flag
|
| - would not see many of the template definitions they now see, and rely
|
| - instead on ready-instantiated specializations in the library. This
|
| - technique would be useful for the following substantial components:
|
| - string, locale/iostreams, valarray. It would *not* be useful or
|
| - usable with the following: containers, algorithms, iterators,
|
| - allocator. Since these constitute a large (though decreasing)
|
| - fraction of the library, the benefit the technique offers is
|
| - limited.
|
| -
|
| - The language specifies the semantics of the "export" keyword, but
|
| - the gcc compiler does not yet support it. When it does, problems
|
| - with large template inclusions can largely disappear, given some
|
| - minor library reorganization, along with the need for the apparatus
|
| - described above.
|
| -
|
| - Overhead: Flexibility Cost
|
| - --------------------------
|
| -
|
| - The library offers many places where users can specify operations
|
| - to be performed by the library in place of defaults. Sometimes
|
| - this seems to require that the library use a more-roundabout, and
|
| - possibly slower, way to accomplish the default requirements than
|
| - would be used otherwise.
|
| -
|
| - The primary protection against this overhead is thorough compiler
|
| - optimization, to crush out layers of inline function interfaces.
|
| - Kuck & Associates has demonstrated the practicality of this kind
|
| - of optimization.
|
| -
|
| - The second line of defense against this overhead is explicit
|
| - specialization. By defining helper function templates, and writing
|
| - specialized code for the default case, overhead can be eliminated
|
| - for that case without sacrificing flexibility. This takes full
|
| - advantage of any ability of the optimizer to crush out degenerate
|
| - code.
|
| -
|
| - The library specifies many virtual functions which current linkers
|
| - load even when they cannot be called. Some minor improvements to the
|
| - compiler and to ld would eliminate any such overhead by simply
|
| - omitting virtual functions that the complete program does not call.
|
| - A prototype of this work has already been done. For targets where
|
| - GNU ld is not used, a "pre-linker" could do the same job.
|
| -
|
| - The main areas in the standard interface where user flexibility
|
| - can result in overhead are:
|
| -
|
| - - Allocators: Containers are specified to use user-definable
|
| - allocator types and objects, making tuning for the container
|
| - characteristics tricky.
|
| -
|
| - - Locales: the standard specifies locale objects used to implement
|
| - iostream operations, involving many virtual functions which use
|
| - streambuf iterators.
|
| -
|
| - - Algorithms and containers: these may be instantiated on any type,
|
| - frequently duplicating code for identical operations.
|
| -
|
| - - Iostreams and strings: users are permitted to use these on their
|
| - own types, and specify the operations the stream must use on these
|
| - types.
|
| -
|
| - Note that these sources of overhead are _avoidable_. The techniques
|
| - to avoid them are covered below.
|
| -
|
| - Code Bloat
|
| - ----------
|
| -
|
| - In the SGI STL, and in some other headers, many of the templates
|
| - are defined "inline" -- either explicitly or by their placement
|
| - in class definitions -- which should not be inline. This is a
|
| - source of code bloat. Matt had remarked that he was relying on
|
| - the compiler to recognize what was too big to benefit from inlining,
|
| - and generate it out-of-line automatically. However, this also can
|
| - result in code bloat except where the linker can eliminate the extra
|
| - copies.
|
| -
|
| - Fixing these cases will require an audit of all inline functions
|
| - defined in the library to determine which merit inlining, and moving
|
| - the rest out of line. This is an issue mainly in chapters 23, 25, and
|
| - 27. Of course it can be done incrementally, and we should generally
|
| - accept patches that move large functions out of line and into ".tcc"
|
| - files, which can later be pulled into a repository. Compiler/linker
|
| - improvements to recognize very large inline functions and move them
|
| - out-of-line, but shared among compilation units, could make this
|
| - work unnecessary.
|
| -
|
| - Pre-instantiating template specializations currently produces large
|
| - amounts of dead code which bloats statically linked programs. The
|
| - current state of the static library, libstdc++.a, is intolerable on
|
| - this account, and will fuel further confused speculation about a need
|
| - for a library "subset". A compiler improvement that treats each
|
| - instantiated function as a separate object file, for linking purposes,
|
| - would be one solution to this problem. An alternative would be to
|
| - split up the manual instantiation files into dozens upon dozens of
|
| - little files, each compiled separately, but an abortive attempt at
|
| - this was done for <string> and, though it is far from complete, it
|
| - is already a nuisance. A better interim solution (just until we have
|
| - "export") is badly needed.
|
| -
|
| - When building a shared library, the current compiler/linker cannot
|
| - automatically generate the instantiations needed. This creates a
|
| - miserable situation; it means any time something is changed in the
|
| - library, before a shared library can be built someone must manually
|
| - copy the declarations of all templates that are needed by other parts
|
| - of the library to an "instantiation" file, and add it to the build
|
| - system to be compiled and linked to the library. This process is
|
| - readily automated, and should be automated as soon as possible.
|
| - Users building their own shared libraries experience identical
|
| - frustrations.
|
| -
|
| - Sharing common aspects of template definitions among instantiations
|
| - can radically reduce code bloat. The compiler could help a great
|
| - deal here by recognizing when a function depends on nothing about
|
| - a template parameter, or only on its size, and giving the resulting
|
| - function a link-name "equate" that allows it to be shared with other
|
| - instantiations. Implementation code could take advantage of the
|
| - capability by factoring out code that does not depend on the template
|
| - argument into separate functions to be merged by the compiler.
|
| -
|
| - Until such a compiler optimization is implemented, much can be done
|
| - manually (if tediously) in this direction. One such optimization is
|
| - to derive class templates from non-template classes, and move as much
|
| - implementation as possible into the base class. Another is to partial-
|
| - specialize certain common instantiations, such as vector<T*>, to share
|
| - code for instantiations on all types T. While these techniques work,
|
| - they are far from the complete solution that a compiler improvement
|
| - would afford.
|
| -
|
| - Overhead: Expensive Language Features
|
| - -------------------------------------
|
| -
|
| - The main "expensive" language feature used in the standard library
|
| - is exception support, which requires compiling in cleanup code with
|
| - static table data to locate it, and linking in library code to use
|
| - the table. For small embedded programs the amount of such library
|
| - code and table data is assumed by some to be excessive. Under the
|
| - "new" ABI this perception is generally exaggerated, although in some
|
| - cases it may actually be excessive.
|
| -
|
| - To implement a library which does not use exceptions directly is
|
| - not difficult given minor compiler support (to "turn off" exceptions
|
| - and ignore exception constructs), and results in no great library
|
| - maintenance difficulties. To be precise, given "-fno-exceptions",
|
| - the compiler should treat "try" blocks as ordinary blocks, and
|
| - "catch" blocks as dead code to ignore or eliminate. Compiler
|
| - support is not strictly necessary, except in the case of "function
|
| - try blocks"; otherwise the following macros almost suffice:
|
| -
|
| - #define throw(X)
|
| - #define try if (true)
|
| - #define catch(X) else if (false)
|
| -
|
| - However, there may be a need to use function try blocks in the
|
| - library implementation, and use of macros in this way can make
|
| - correct diagnostics impossible. Furthermore, use of this scheme
|
| - would require the library to call a function to re-throw exceptions
|
| - from a try block. Implementing the above semantics in the compiler
|
| - is preferable.
|
| -
|
| - Given the support above (however implemented) it only remains to
|
| - replace code that "throws" with a call to a well-documented "handler"
|
| - function in a separate compilation unit which may be replaced by
|
| - the user. The main source of exceptions that would be difficult
|
| - for users to avoid is memory allocation failures, but users can
|
| - define their own memory allocation primitives that never throw.
|
| - Otherwise, the complete list of such handlers, and which library
|
| - functions may call them, would be needed for users to be able to
|
| - implement the necessary substitutes. (Fortunately, they have the
|
| - source code.)
|
| -
|
| - Opportunities
|
| - -------------
|
| -
|
| - The template capabilities of C++ offer enormous opportunities for
|
| - optimizing common library operations, well beyond what would be
|
| - considered "eliminating overhead". In particular, many operations
|
| - done in Glibc with macros that depend on proprietary language
|
| - extensions can be implemented in pristine Standard C++. For example,
|
| - the chapter 25 algorithms, and even C library functions such as strchr,
|
| - can be specialized for the case of static arrays of known (small) size.
|
| -
|
| - Detailed optimization opportunities are identified below where
|
| - the component where they would appear is discussed. Of course new
|
| - opportunities will be identified during implementation.
|
| -
|
| - Unimplemented Required Library Features
|
| - ---------------------------------------
|
| -
|
| - The standard specifies hundreds of components, grouped broadly by
|
| - chapter. These are listed in excruciating detail in the CHECKLIST
|
| - file.
|
| -
|
| - 17 general
|
| - 18 support
|
| - 19 diagnostics
|
| - 20 utilities
|
| - 21 string
|
| - 22 locale
|
| - 23 containers
|
| - 24 iterators
|
| - 25 algorithms
|
| - 26 numerics
|
| - 27 iostreams
|
| - Annex D backward compatibility
|
| -
|
| - Anyone participating in implementation of the library should obtain
|
| - a copy of the standard, ISO 14882. People in the U.S. can obtain an
|
| - electronic copy for US$18 from ANSI's web site. Those from other
|
| - countries should visit http://www.iso.ch/ to find out the location
|
| - of their country's representation in ISO, in order to know who can
|
| - sell them a copy.
|
| -
|
| - The emphasis in the following sections is on unimplemented features
|
| - and optimization opportunities.
|
| -
|
| - Chapter 17 General
|
| - -------------------
|
| -
|
| - Chapter 17 concerns overall library requirements.
|
| -
|
| - The standard doesn't mention threads. A multi-thread (MT) extension
|
| - primarily affects operators new and delete (18), allocator (20),
|
| - string (21), locale (22), and iostreams (27). The common underlying
|
| - support needed for this is discussed under chapter 20.
|
| -
|
| - The standard requirements on names from the C headers create a
|
| - lot of work, mostly done. Names in the C headers must be visible
|
| - in the std:: and sometimes the global namespace; the names in the
|
| - two scopes must refer to the same object. More stringent is that
|
| - Koenig lookup implies that any types specified as defined in std::
|
| - really are defined in std::. Names optionally implemented as
|
| - macros in C cannot be macros in C++. (An overview may be read at
|
| - <http://www.cantrip.org/cheaders.html>). The scripts "inclosure"
|
| - and "mkcshadow", and the directories shadow/ and cshadow/, are the
|
| - beginning of an effort to conform in this area.
|
| -
|
| - A correct conforming definition of C header names based on underlying
|
| - C library headers, and practical linking of conforming namespaced
|
| - customer code with third-party C libraries depends ultimately on
|
| - an ABI change, allowing namespaced C type names to be mangled into
|
| - type names as if they were global, somewhat as C function names in a
|
| - namespace, or C++ global variable names, are left unmangled. Perhaps
|
| - another "extern" mode, such as 'extern "C-global"' would be an
|
| - appropriate place for such type definitions. Such a type would
|
| - affect mangling as follows:
|
| -
|
| - namespace A {
|
| - struct X {};
|
| - extern "C-global" { // or maybe just 'extern "C"'
|
| - struct Y {};
|
| - };
|
| - }
|
| - void f(A::X*); // mangles to f__FPQ21A1X
|
| - void f(A::Y*); // mangles to f__FP1Y
|
| -
|
| - (It may be that this is really the appropriate semantics for regular
|
| - 'extern "C"', and 'extern "C-global"', as an extension, would not be
|
| - necessary.) This would allow functions declared in non-standard C headers
|
| - (and thus fixable by neither us nor users) to link properly with functions
|
| - declared using C types defined in properly-namespaced headers. The
|
| - problem this solves is that C headers (which C++ programmers do persist
|
| - in using) frequently forward-declare C struct tags without including
|
| - the header where the type is defined, as in
|
| -
|
| - struct tm;
|
| - void munge(tm*);
|
| -
|
| - Without some compiler accommodation, munge cannot be called by correct
|
| - C++ code using a pointer to a correctly-scoped tm* value.
|
| -
|
| - The current C headers use the preprocessor extension "#include_next",
|
| - which the compiler complains about when run "-pedantic".
|
| - (Incidentally, it appears that "-fpedantic" is currently ignored,
|
| - probably a bug.) The solution in the C compiler is to use
|
| - "-isystem" rather than "-I", but unfortunately in g++ this seems
|
| - also to wrap the whole header in an 'extern "C"' block, so it's
|
| - unusable for C++ headers. The correct solution appears to be to
|
| - allow the various special include-directory options, if not given
|
| - an argument, to affect subsequent include-directory options additively,
|
| - so that if one said
|
| -
|
| - -pedantic -iprefix $(prefix) \
|
| - -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \
|
| - -iwithprefix -I g++-v3/ext
|
| -
|
| - the compiler would search $(prefix)/g++-v3 and not report
|
| - pedantic warnings for files found there, but treat files in
|
| - $(prefix)/g++-v3/ext pedantically. (The undocumented semantics
|
| - of "-isystem" in g++ stink. Can they be rescinded? If not it
|
| - must be replaced with something more rationally behaved.)
|
| -
|
| - All the C headers need the treatment above; in the standard these
|
| - headers are mentioned in various chapters. Below, I have only
|
| - mentioned those that present interesting implementation issues.
|
| -
|
| - The components identified as "mostly complete", below, have not been
|
| - audited for conformance. In many cases where the library passes
|
| - conformance tests we have non-conforming extensions that must be
|
| - wrapped in #if guards for "pedantic" use, and in some cases renamed
|
| - in a conforming way for continued use in the implementation regardless
|
| - of conformance flags.
|
| -
|
| - The STL portion of the library still depends on a header
|
| - stl/bits/stl_config.h full of #ifdef clauses. This apparatus
|
| - should be replaced with autoconf/automake machinery.
|
| -
|
| - The SGI STL defines a type_traits<> template, specialized for
|
| - many types in their code including the built-in numeric and
|
| - pointer types and some library types, to direct optimizations of
|
| - standard functions. The SGI compiler has been extended to generate
|
| - specializations of this template automatically for user types,
|
| - so that use of STL templates on user types can take advantage of
|
| - these optimizations. Specializations for other, non-STL, types
|
| - would make more optimizations possible, but extending the gcc
|
| - compiler in the same way would be much better. Probably the next
|
| - round of standardization will ratify this, but probably with
|
| - changes, so it probably should be renamed to place it in the
|
| - implementation namespace.
|
| -
|
| - The SGI STL also defines a large number of extensions visible in
|
| - standard headers. (Other extensions that appear in separate headers
|
| - have been sequestered in subdirectories ext/ and backward/.) All
|
| - these extensions should be moved to other headers where possible,
|
| - and in any case wrapped in a namespace (not std!), and (where kept
|
| - in a standard header) girded about with macro guards. Some cannot be
|
| - moved out of standard headers because they are used to implement
|
| - standard features. The canonical method for accommodating these
|
| - is to use a protected name, aliased in macro guards to a user-space
|
| - name. Unfortunately C++ offers no satisfactory template typedef
|
| - mechanism, so very ad-hoc and unsatisfactory aliasing must be used
|
| - instead.
|
| -
|
| - Implementation of a template typedef mechanism should have the highest
|
| - priority among possible extensions, on the same level as implementation
|
| - of the template "export" feature.
|
| -
|
| - Chapter 18 Language support
|
| - ----------------------------
|
| -
|
| - Headers: <limits> <new> <typeinfo> <exception>
|
| - C headers: <cstddef> <climits> <cfloat> <cstdarg> <csetjmp>
|
| - <ctime> <csignal> <cstdlib> (also 21, 25, 26)
|
| -
|
| - This defines the built-in exceptions, rtti, numeric_limits<>,
|
| - operator new and delete. Much of this is provided by the
|
| - compiler in its static runtime library.
|
| -
|
| - Work to do includes defining numeric_limits<> specializations in
|
| - separate files for all target architectures. Values for integer types
|
| - except for bool and wchar_t are readily obtained from the C header
|
| - <limits.h>, but values for the remaining numeric types (bool, wchar_t,
|
| - float, double, long double) must be entered manually. This is
|
| - largely dog work except for those members whose values are not
|
| - easily deduced from available documentation. Also, this involves
|
| - some work in target configuration to identify the correct choice of
|
| - file to build against and to install.
|
| -
|
| - The definitions of the various operators new and delete must be
|
| - made thread-safe, which depends on a portable exclusion mechanism,
|
| - discussed under chapter 20. Of course there is always plenty of
|
| - room for improvements to the speed of operators new and delete.
|
| -
|
| - <cstdarg>, in Glibc, defines some macros that gcc does not allow to
|
| - be wrapped into an inline function. Probably this header will demand
|
| - attention whenever a new target is chosen. The functions atexit(),
|
| - exit(), and abort() in cstdlib have different semantics in C++, so
|
| - must be re-implemented for C++.
|
| -
|
| - Chapter 19 Diagnostics
|
| - -----------------------
|
| -
|
| - Headers: <stdexcept>
|
| - C headers: <cassert> <cerrno>
|
| -
|
| - This defines the standard exception objects, which are "mostly complete".
|
| - Cygnus has a version, and now SGI provides a slightly different one.
|
| - It makes little difference which we use.
|
| -
|
| - The C global name "errno", which C allows to be a variable or a macro,
|
| - is required in C++ to be a macro. For MT it must typically result in
|
| - a function call.
|
| -
|
| - Chapter 20 Utilities
|
| - ---------------------
|
| - Headers: <utility> <functional> <memory>
|
| - C header: <ctime> (also in 18)
|
| -
|
| - SGI STL provides "mostly complete" versions of all the components
|
| - defined in this chapter. However, the auto_ptr<> implementation
|
| - is known to be wrong. Furthermore, the standard definition of it
|
| - is known to be unimplementable as written. A minor change to the
|
| - standard would fix it, and auto_ptr<> should be adjusted to match.
|
| -
|
| - Multi-threading affects the allocator implementation, and there must
|
| - be configuration/installation choices for different users' MT
|
| - requirements. Anyway, users will want to tune allocator options
|
| - to support different target conditions, MT or no.
|
| -
|
| - The primitives used for MT implementation should be exposed, as an
|
| - extension, for users' own work. We need cross-CPU "mutex" support,
|
| - multi-processor shared-memory atomic integer operations, and single-
|
| - processor uninterruptible integer operations, and all three configurable
|
| - to be stubbed out for non-MT use, or to use an appropriately-loaded
|
| - dynamic library for the actual runtime environment, or statically
|
| - compiled in for cases where the target architecture is known.
|
| -
|
| - Chapter 21 String
|
| - ------------------
|
| - Headers: <string>
|
| - C headers: <cctype> <cwctype> <cstring> <cwchar> (also in 27)
|
| - <cstdlib> (also in 18, 25, 26)
|
| -
|
| - We have "mostly-complete" char_traits<> implementations. Many of the
|
| - char_traits<char> operations might be optimized further using existing
|
| - proprietary language extensions.
|
| -
|
| - We have a "mostly-complete" basic_string<> implementation. The work
|
| - to manually instantiate char and wchar_t specializations in object
|
| - files to improve link-time behavior is extremely unsatisfactory,
|
| - literally tripling library-build time with no commensurate improvement
|
| - in static program link sizes. It must be redone. (Similar work is
|
| - needed for some components in chapters 22 and 27.)
|
| -
|
| - Other work needed for strings is MT-safety, as discussed under the
|
| - chapter 20 heading.
|
| -
|
| - The standard C type mbstate_t from <cwchar> and used in char_traits<>
|
| - must be different in C++ than in C, because in C++ the default constructor
|
| - value mbstate_t() must be the "base" or "ground" sequence state.
|
| - (According to the likely resolution of a recently raised Core issue,
|
| - this may become unnecessary. However, there are other reasons to
|
| - use a state type not as limited as whatever the C library provides.)
|
| - If we might want to provide conversions from (e.g.) internally-
|
| - represented EUC-wide to externally-represented Unicode, or vice-
|
| - versa, the mbstate_t we choose will need to be more accommodating
|
| - than what might be provided by an underlying C library.
|
| -
|
| - There remain some basic_string template-member functions which do
|
| - not overload properly with their non-template brethren. The infamous
|
| - hack akin to what was done in vector<> is needed, to conform to
|
| - 23.1.1 para 10. The CHECKLIST items for basic_string marked 'X',
|
| - or incomplete, are so marked for this reason.
|
| -
|
| - Replacing the string iterators, which currently are simple character
|
| - pointers, with class objects would greatly increase the safety of the
|
| - client interface, and also permit a "debug" mode in which range,
|
| - ownership, and validity are rigorously checked. The current use of
|
| - raw pointers as string iterators is evil. vector<> iterators need the
|
| - same treatment. Note that the current implementation freely mixes
|
| - pointers and iterators, and that must be fixed before safer iterators
|
| - can be introduced.
|
| -
|
| - Some of the functions in <cstring> are different from the C version.
|
| - generally overloaded on const and non-const argument pointers. For
|
| - example, in <cstring> strchr is overloaded. The functions isupper
|
| - etc. in <cctype> typically implemented as macros in C are functions
|
| - in C++, because they are overloaded with others of the same name
|
| - defined in <locale>.
|
| -
|
| - Many of the functions required in <cwctype> and <cwchar> cannot be
|
| - implemented using underlying C facilities on intended targets because
|
| - such facilities only partly exist.
|
| -
|
| - Chapter 22 Locale
|
| - ------------------
|
| - Headers: <locale>
|
| - C headers: <clocale>
|
| -
|
| - We have a "mostly complete" class locale, with the exception of
|
| - code for constructing, and handling the names of, named locales.
|
| - The ways that locales are named (particularly when categories
|
| - (e.g. LC_TIME, LC_COLLATE) are different) varies among all target
|
| - environments. This code must be written in various versions and
|
| - chosen by configuration parameters.
|
| -
|
| - Members of many of the facets defined in <locale> are stubs. Generally,
|
| - there are two sets of facets: the base class facets (which are supposed
|
| - to implement the "C" locale) and the "byname" facets, which are supposed
|
| - to read files to determine their behavior. The base ctype<>, collate<>,
|
| - and numpunct<> facets are "mostly complete", except that the table of
|
| - bitmask values used for "is" operations, and corresponding mask values,
|
| - are still defined in libio and just included/linked. (We will need to
|
| - implement these tables independently, soon, but should take advantage
|
| - of libio where possible.) The num_put<>::put members for integer types
|
| - are "mostly complete".
|
| -
|
| - A complete list of what has and has not been implemented may be
|
| - found in CHECKLIST. However, note that the current definition of
|
| - codecvt<wchar_t,char,mbstate_t> is wrong. It should simply write
|
| - out the raw bytes representing the wide characters, rather than
|
| - trying to convert each to a corresponding single "char" value.
|
| -
|
| - Some of the facets are more important than others. Specifically,
|
| - the members of ctype<>, numpunct<>, num_put<>, and num_get<> facets
|
| - are used by other library facilities defined in <string>, <istream>,
|
| - and <ostream>, and the codecvt<> facet is used by basic_filebuf<>
|
| - in <fstream>, so a conforming iostream implementation depends on
|
| - these.
|
| -
|
| - The "long long" type eventually must be supported, but code mentioning
|
| - it should be wrapped in #if guards to allow pedantic-mode compiling.
|
| -
|
| - Performance of num_put<> and num_get<> depend critically on
|
| - caching computed values in ios_base objects, and on extensions
|
| - to the interface with streambufs.
|
| -
|
| - Specifically: retrieving a copy of the locale object, extracting
|
| - the needed facets, and gathering data from them, for each call to
|
| - (e.g.) operator<< would be prohibitively slow. To cache format
|
| - data for use by num_put<> and num_get<> we have a _Format_cache<>
|
| - object stored in the ios_base::pword() array. This is constructed
|
| - and initialized lazily, and is organized purely for utility. It
|
| - is discarded when a new locale with different facets is imbued.
|
| -
|
| - Using only the public interfaces of the iterator arguments to the
|
| - facet functions would limit performance by forbidding "vector-style"
|
| - character operations. The streambuf iterator optimizations are
|
| - described under chapter 24, but facets can also bypass the streambuf
|
| - iterators via explicit specializations and operate directly on the
|
| - streambufs, and use extended interfaces to get direct access to the
|
| - streambuf internal buffer arrays. These extensions are mentioned
|
| - under chapter 27. These optimizations are particularly important
|
| - for input parsing.
|
| -
|
| - Unused virtual members of locale facets can be omitted, as mentioned
|
| - above, by a smart linker.
|
| -
|
| - Chapter 23 Containers
|
| - ----------------------
|
| - Headers: <deque> <list> <queue> <stack> <vector> <map> <set> <bitset>
|
| -
|
| - All the components in chapter 23 are implemented in the SGI STL.
|
| - They are "mostly complete"; they include a large number of
|
| - nonconforming extensions which must be wrapped. Some of these
|
| - are used internally and must be renamed or duplicated.
|
| -
|
| - The SGI components are optimized for large-memory environments. For
|
| - embedded targets, different criteria might be more appropriate. Users
|
| - will want to be able to tune this behavior. We should provide
|
| - ways for users to compile the library with different memory usage
|
| - characteristics.
|
| -
|
| - A lot more work is needed on factoring out common code from different
|
| - specializations to reduce code size here and in chapter 25. The
|
| - easiest fix for this would be a compiler/ABI improvement that allows
|
| - the compiler to recognize when a specialization depends only on the
|
| - size (or other gross quality) of a template argument, and allow the
|
| - linker to share the code with similar specializations. In its
|
| - absence, many of the algorithms and containers can be partial-
|
| - specialized, at least for the case of pointers, but this only solves
|
| - a small part of the problem. Use of a type_traits-style template
|
| - allows a few more optimization opportunities, more if the compiler
|
| - can generate the specializations automatically.
|
| -
|
| - As an optimization, containers can specialize on the default allocator
|
| - and bypass it, or take advantage of details of its implementation
|
| - after it has been improved upon.
|
| -
|
| - Replacing the vector iterators, which currently are simple element
|
| - pointers, with class objects would greatly increase the safety of the
|
| - client interface, and also permit a "debug" mode in which range,
|
| - ownership, and validity are rigorously checked. The current use of
|
| - pointers for iterators is evil.
|
| -
|
| - As mentioned for chapter 24, the deque iterator is a good example of
|
| - an opportunity to implement a "staged" iterator that would benefit
|
| - from specializations of some algorithms.
|
| -
|
| - Chapter 24 Iterators
|
| - ---------------------
|
| - Headers: <iterator>
|
| -
|
| - Standard iterators are "mostly complete", with the exception of
|
| - the stream iterators, which are not yet templatized on the
|
| - stream type. Also, the base class template iterator<> appears
|
| - to be wrong, so everything derived from it must also be wrong,
|
| - currently.
|
| -
|
| - The streambuf iterators (currently located in stl/bits/std_iterator.h,
|
| - but should be under bits/) can be rewritten to take advantage of
|
| - friendship with the streambuf implementation.
|
| -
|
| - Matt Austern has identified opportunities where certain iterator
|
| - types, particularly including streambuf iterators and deque
|
| - iterators, have a "two-stage" quality, such that an intermediate
|
| - limit can be checked much more quickly than the true limit on
|
| - range operations. If identified with a member of iterator_traits,
|
| - algorithms may be specialized for this case. Of course the
|
| - iterators that have this quality can be identified by specializing
|
| - a traits class.
|
| -
|
| - Many of the algorithms must be specialized for the streambuf
|
| - iterators, to take advantage of block-mode operations, in order
|
| - to allow iostream/locale operations' performance not to suffer.
|
| - It may be that they could be treated as staged iterators and
|
| - take advantage of those optimizations.
|
| -
|
| - Chapter 25 Algorithms
|
| - ----------------------
|
| - Headers: <algorithm>
|
| - C headers: <cstdlib> (also in 18, 21, 26))
|
| -
|
| - The algorithms are "mostly complete". As mentioned above, they
|
| - are optimized for speed at the expense of code and data size.
|
| -
|
| - Specializations of many of the algorithms for non-STL types would
|
| - give performance improvements, but we must use great care not to
|
| - interfere with fragile template overloading semantics for the
|
| - standard interfaces. Conventionally the standard function template
|
| - interface is an inline which delegates to a non-standard function
|
| - which is then overloaded (this is already done in many places in
|
| - the library). Particularly appealing opportunities for the sake of
|
| - iostream performance are for copy and find applied to streambuf
|
| - iterators or (as noted elsewhere) for staged iterators, of which
|
| - the streambuf iterators are a good example.
|
| -
|
| - The bsearch and qsort functions cannot be overloaded properly as
|
| - required by the standard because gcc does not yet allow overloading
|
| - on the extern-"C"-ness of a function pointer.
|
| -
|
| - Chapter 26 Numerics
|
| - --------------------
|
| - Headers: <complex> <valarray> <numeric>
|
| - C headers: <cmath>, <cstdlib> (also 18, 21, 25)
|
| -
|
| - Numeric components: Gabriel dos Reis's valarray, Drepper's complex,
|
| - and the few algorithms from the STL are "mostly done". Of course
|
| - optimization opportunities abound for the numerically literate. It
|
| - is not clear whether the valarray implementation really conforms
|
| - fully, in the assumptions it makes about aliasing (and lack thereof)
|
| - in its arguments.
|
| -
|
| - The C div() and ldiv() functions are interesting, because they are the
|
| - only case where a C library function returns a class object by value.
|
| - Since the C++ type div_t must be different from the underlying C type
|
| - (which is in the wrong namespace) the underlying functions div() and
|
| - ldiv() cannot be re-used efficiently. Fortunately they are trivial to
|
| - re-implement.
|
| -
|
| - Chapter 27 Iostreams
|
| - ---------------------
|
| - Headers: <iosfwd> <streambuf> <ios> <ostream> <istream> <iostream>
|
| - <iomanip> <sstream> <fstream>
|
| - C headers: <cstdio> <cwchar> (also in 21)
|
| -
|
| - Iostream is currently in a very incomplete state. <iosfwd>, <iomanip>,
|
| - ios_base, and basic_ios<> are "mostly complete". basic_streambuf<> and
|
| - basic_ostream<> are well along, but basic_istream<> has had little work
|
| - done. The standard stream objects, <sstream> and <fstream> have been
|
| - started; basic_filebuf<> "write" functions have been implemented just
|
| - enough to do "hello, world".
|
| -
|
| - Most of the istream and ostream operators << and >> (with the exception
|
| - of the op<<(integer) ones) have not been changed to use locale primitives,
|
| - sentry objects, or char_traits members.
|
| -
|
| - All these templates should be manually instantiated for char and
|
| - wchar_t in a way that links only used members into user programs.
|
| -
|
| - Streambuf is fertile ground for optimization extensions. An extended
|
| - interface giving iterator access to its internal buffer would be very
|
| - useful for other library components.
|
| -
|
| - Iostream operations (primarily operators << and >>) can take advantage
|
| - of the case where user code has not specified a locale, and bypass locale
|
| - operations entirely. The current implementation of op<</num_put<>::put,
|
| - for the integer types, demonstrates how they can cache encoding details
|
| - from the locale on each operation. There is lots more room for
|
| - optimization in this area.
|
| -
|
| - The definition of the relationship between the standard streams
|
| - cout et al. and stdout et al. requires something like a "stdiobuf".
|
| - The SGI solution of using double-indirection to actually use a
|
| - stdio FILE object for buffering is unsatisfactory, because it
|
| - interferes with peephole loop optimizations.
|
| -
|
| - The <sstream> header work has begun. stringbuf can benefit from
|
| - friendship with basic_string<> and basic_string<>::_Rep to use
|
| - those objects directly as buffers, and avoid allocating and making
|
| - copies.
|
| -
|
| - The basic_filebuf<> template is a complex beast. It is specified to
|
| - use the locale facet codecvt<> to translate characters between native
|
| - files and the locale character encoding. In general this involves
|
| - two buffers, one of "char" representing the file and another of
|
| - "char_type", for the stream, with codecvt<> translating. The process
|
| - is complicated by the variable-length nature of the translation, and
|
| - the need to seek to corresponding places in the two representations.
|
| - For the case of basic_filebuf<char>, when no translation is needed,
|
| - a single buffer suffices. A specialized filebuf can be used to reduce
|
| - code space overhead when no locale has been imbued. Matt Austern's
|
| - work at SGI will be useful, perhaps directly as a source of code, or
|
| - at least as an example to draw on.
|
| -
|
| - Filebuf, almost uniquely (cf. operator new), depends heavily on
|
| - underlying environmental facilities. In current releases iostream
|
| - depends fairly heavily on libio constant definitions, but it should
|
| - be made independent. It also depends on operating system primitives
|
| - for file operations. There is immense room for optimizations using
|
| - (e.g.) mmap for reading. The shadow/ directory wraps, besides the
|
| - standard C headers, the libio.h and unistd.h headers, for use mainly
|
| - by filebuf. These wrappings have not been completed, though there
|
| - is scaffolding in place.
|
| -
|
| - The encapsulation of certain C header <cstdio> names presents an
|
| - interesting problem. It is possible to define an inline std::fprintf()
|
| - implemented in terms of the 'extern "C"' vfprintf(), but there is no
|
| - standard vfscanf() to use to implement std::fscanf(). It appears that
|
| - vfscanf but be re-implemented in C++ for targets where no vfscanf
|
| - extension has been defined. This is interesting in that it seems
|
| - to be the only significant case in the C library where this kind of
|
| - rewriting is necessary. (Of course Glibc provides the vfscanf()
|
| - extension.) (The functions related to exit() must be rewritten
|
| - for other reasons.)
|
| -
|
| -
|
| - Annex D
|
| - -------
|
| - Headers: <strstream>
|
| -
|
| - Annex D defines many non-library features, and many minor
|
| - modifications to various headers, and a complete header.
|
| - It is "mostly done", except that the libstdc++-2 <strstream>
|
| - header has not been adopted into the library, or checked to
|
| - verify that it matches the draft in those details that were
|
| - clarified by the committee. Certainly it must at least be
|
| - moved into the std namespace.
|
| -
|
| - We still need to wrap all the deprecated features in #if guards
|
| - so that pedantic compile modes can detect their use.
|
| -
|
| - Nonstandard Extensions
|
| - ----------------------
|
| - Headers: <iostream.h> <strstream.h> <hash> <rbtree>
|
| - <pthread_alloc> <stdiobuf> (etc.)
|
| -
|
| - User code has come to depend on a variety of nonstandard components
|
| - that we must not omit. Much of this code can be adopted from
|
| - libstdc++-v2 or from the SGI STL. This particularly includes
|
| - <iostream.h>, <strstream.h>, and various SGI extensions such
|
| - as <hash_map.h>. Many of these are already placed in the
|
| - subdirectories ext/ and backward/. (Note that it is better to
|
| - include them via "<backward/hash_map.h>" or "<ext/hash_map>" than
|
| - to search the subdirectory itself via a "-I" directive.
|
| - </literallayout>
|
| -</sect1>
|
| -
|
| -</appendix>
|
|
|