ordering of constructors
Daniel Jacobowitz
drow@false.org
Fri Apr 9 16:12:00 GMT 2004
On Fri, Apr 09, 2004 at 03:33:20PM +0200, Gabriel Dos Reis wrote:
> Daniel Jacobowitz <drow@false.org> writes:
>
> | On Fri, Apr 09, 2004 at 02:15:24PM +0200, Gabriel Dos Reis wrote:
> | > For example, it can be something like
> | >
> | > A.H:
> | > struct A { some constructor ... };
> | > extern A a;
> | > void make_sure_a_is_constructed();
> | >
> | > A.C
> | > A a;
> | >
> | > void make_sure_a_is_constructed() { /* empty */ }
> | >
> | >
> | >
> | > B.H:
> | > #include "A.H"
> | > struct B { ... }
> | >
> | > B::B()
> | > {
> | > make_sure_a_is_constructed();
> | > // use a...
> | > }
> | >
> | > B.cc;
> | > B b;
> | >
> | >
> | >
> | > The call to make_sure_a_is_constructed(), will provoke the
> | > initialization of a, before that function is executed.
> |
> | Er... for those of us ignorant, could you explain why this assures
> | anything?
>
> 3.6.2/3
>
> It is implementation-defined whether or not the dynamic
> initialization (8.5, 9.4, 12.1, 12.6.1) of an object of namespace
> scope is done before the first statement of main. If the
> initialization is deferred to some point in time after the first
> statement of main, *it shall occur before the first use of any
> function or object defined in the same translation unit as the
> object to be initialized*.
>
> (emphasis is mine).
Does that answer the question? I don't believe that it does. In this
case, the initialization is _not_ deferred until after the first
statement of main. Instead, we're before main executing global
constructors.
To honor your interpretation of that paragraph, we would have to check
at the beginning of every external function in every translation unit
containing static variables whether they had been initialized yet,
which would be prohibitively expensive - and I'm pretty sure we don't
do that.
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
More information about the Gcc
mailing list