skaller <[EMAIL PROTECTED]> writes:

> On Tue, 2007-11-06 at 06:29 -0800, Ian Lance Taylor wrote:
> > skaller <[EMAIL PROTECTED]> writes:
> 
> > I recommend that you just read the standard and see the real aliasing
> > rules.
> 
> I don't care about that, I'm trying to discover what
> -fno-strict-aliasing actually does.
> 
> You hinted that it weakens the rules, without entirely
> disabling type based optimisations.

I have no idea what I hinted.  What -fno-strict-aliasing does is turn
off type-based alias analysis.  The documentation is accurate.


> > What, other than strict aliasing, tells you that the two types can not
> > be aliased?  It is perfectly possible to do a 32-bit write to half of
> > a 64-bit value.
> 
> What I'm mainly interested in is how "valid" aliases where
> you write one and read the other will be affected by the
> -fno-strict-aliasing switch.
> 
> The code does what it has to, so it doesn't matter what
> the Standard says is allowed and what it says is not:
> what matters is whether I have to use -fno-strict-aliasing
> to ensure my code will work as I expect, and what that
> will cost in terms of optimising unrelated code.
> 
> As a contrived example:
> 
>       void f() {
>               struct X { int x; X(int a) : x(a) {} };
>               X w(1);
>               int *px = (int*)(void*)&w;
>               assert( (void*)px == (void*)&w);
>               assert( (void*)px == (void*)(&w.x));
>               cout << *px << endl;
>       }
> 
> I expect this to print 1 every time, despite the fact that
> px and &w are pointers to the same store seen as different
> types. I believe the compiler is entitled under strict aliasing
> rules to completely elide the constructor application.
> However the assertions cannot fail.

In this particular case the compiler is likely to act as you expect.
But, yes, in general, you need -fno-strict-aliasing if you want these
kinds of pointer type casts to work as you expect.

Ian

Reply via email to