Problem with -O3 and int to pointer (64bits)
Benjamin Grange
bgrange@gmail.com
Fri Nov 3 18:48:00 GMT 2006
On 11/3/06, Andrew Haley <aph@redhat.com> wrote:
> Benjamin Grange writes:
> > On 11/3/06, Andrew Haley <aph@redhat.com> wrote:
> > > Benjamin Grange writes:
> > > > Do you see a problem in this line?:
> > > > (void *) (unsigned long)(*(((unsigned int *)&a)));
> > >
> > > Yes, I can: it's not legal C++. What are you really tring to do that
> > > needs this?
> > I'm trying to make this code which is not from me to work with O3.
> > In the real code, there is a list class which use void * to save its elements.
> > A lot of other list are derived from this one to avoid doing casting
> > of void * to the original pointer. They all use real pointer, so no
> > problem.
>
> > But there is a special derived list which converts its elements
> > into int and save the int as a void * in order to avoid doing heap
> > allocation. Exactly like the code I have posted.
>
> If you know that the data will all fit within a void*, you can simply do
>
> class A {
> public:
> A(int n) { x = n; }
> int x;
> };
>
> union
> {
> int n;
> void *p;
> } u;
>
> u.n = a.x;
> return u.p;
>
> ... or whatever, depending on your pointer size.
>
> > What make my code not legal C++?
> >
> > Will it be better if I do something like that for put():
> > listA[i] = (void *)a.getInt();
> > and get:
> > return A((int)listA[i])
>
> OK, the rule is this: you cannot access an object of type A through a
> pointer that is not type compatible with A.
>
> So, if you declare:
>
> short *p;
> int a = 9;
> p = (short*)&a;
> return p;
>
> then your code will not work, and current versions of gcc will warn you:
>
> $ gcc /mnt/zebedee/p.c -O2 -Wall
> /mnt/zebedee/p.c: In function 'main':
> /mnt/zebedee/p.c:7: warning: dereferencing type-punned pointer will break strict-aliasing rules
Ok thank you. I will use the getInt() version since it's legal C++ and
pointer size independent.
--
Benjamin
More information about the Gcc-help
mailing list