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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libstdc++-v3/] [docs/] [html/] [17_intro/] [DESIGN] - Blame information for rev 20

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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