Re: is portable aliasing possible in C++?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/09/14 00:25, haynberg@xxxxxxxxx wrote:
>>> msg *p = reinterpret_cast<msg*>(get_bytes());
>>
>> Why are you doing this?
> 
> For efficiency, by preventing a copy (imagine get_bytes() is getting
> bytes out of a socket buffer).

Firstly, char types alias everything.

Secondly, even if you call memcpy(), a compiler doesn't have to do any
copies if it can prove that the union you're reading into doesn't
escape.

Look at this:

double kludge(void *p) {
  union {
    char bytes[sizeof (double)];
    double d;
  } u;
  memcpy(u.bytes, p, sizeof u.bytes);
  return u.d;
}

which generates

kludge:
	ldr	d0, [x0]
	ret

and is completely portable, with no undefined behaviour.

> Putting alignment/padding concerns aside, it would be nice if there
> was a way to explicitly tell the compiler, I want to do this and,
> please don’t reorder stores and loads, or perform other
> strict-aliasing optimizations, on the memory pointed to by this
> pointer (similar to the effect of a memcpy).  I believe the only way
> to do this is with the GCC may_alias attribute, or a more
> heavy-handed memory clobber.  I think the OP wanted to ask the GCC
> folks if there was another, possibly more portable, way; for
> example, placement new, but that turned out not to be an option.

Well, there isn't a more portable way, and we can't ignore alignment.
All that GCC can do is provide a way to do it; we can't make anyone
else comply.

> Another related, maybe more important, question is if GCC sees a
> reinterpet_cast like this (without a may_alias type), is it free to
> discard code or otherwise drastically change it due to the fact that
> it’s undefined by the standard?

Yes.  It may, and it does.

Andrew.




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux