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