Nathan Sidwell wrote:

I attended a UK C++ panel meeting yesterday, and took the opportunity
to solicit opinions on this.  The question I posed was
    struct A {
            ...
        T1 a;
        T2 b;
    };
    void g(T1 &a);
    void Foo () {
       A v;
       v.b = 2;
       g (v.a);
       if (v.b == 2) ...
        }
Does the compiler have a right to presume v.b does indeed == 2 in the if
condition? -- assuming T2 is a suitable type for that :)

After I explained the optimization (and the related structure splitting
optimization), the general consensus was 'yes that would be a useful
optimization'.  But no one was sufficiently confident of proving it
was allowable.  The opinion was expressed that if it was not allowable,
there was a bug in the std.

Will the UK committee open a DR for this? Or, would you care to send mail to Steve Adamczyk about it?


The observation was made that if A is non-POD, one cannot play offsetof
tricks to get from A::a to A::b, so the optimization is safe on non-PODs.
(Of course one would have to prove the address of 'v' did not escape,
so I guess the ctor and dtor would need to be trivial or visible.)

I argued last week that this was not in fact true, in that you can do:

  ptrdiff_t x = &v.b - &v.a;

and then use that instead of "offsetof (Foo, b) - offsetof (Foo, a)".

because (a) badfuncs are more than likely rare and (b) it would be a useful
aid to the programmer.[1] Mark outlines an __I_AM_GOOD__ attribute, I think
it would be better to have both flavours and then the compiler switch can
specify which way the default goes.

Makes sense to me.

--
Mark Mitchell
CodeSourcery, LLC
[EMAIL PROTECTED]
(916) 791-8304

Reply via email to