This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to use __attribute__((__may_alias__))


John Fine <johnsfine@verizon.net> writes:

> Ian Lance Taylor wrote:
>> When you can't use a union, another option is memcpy.
>>   
> That's a pretty ugly choice.

It's not so bad in C++.  Something like this:

template <class dest, class source>
inline dest bit_cast(const source& s) {
  // Compile time assertion: sizeof(dest) == sizeof(source)
  typedef char assertion[sizeof(dest) == sizeof(source) ? 1 : -1];
  dest d;
  memcpy(&d, &s, sizeof(dest));
  return d;
}

lets you write bit_cast<type>(value) and uses memcpy to avoid any
aliasing issues.  While the memcpy looks bad, in practice the compiler
can normally eliminate it.


> I tried that, even though it makes no sense to me (it protects the
> wrong level of indirection).  It didn't work.

I have most likely misunderstood which level you needed to may_alias.
The point was simply to use a typedef to set may_alias.  The may_alias
attribute should apply to the type to which you are pointing, not the
pointer.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]