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: is portable aliasing possible in C++?




On Monday, September 15, 2014 4:36 PM, Andrew Haley <aph@redhat.com> wrote:
On 15/09/14 03:36, Hei Chan wrote:
> 
> This is an interesting thread.
> 
> I think it is very common that people try to avoid making a copy
> from the buffer filled by recv() (or alike) to achieve lowest
> latency.
> 
> Given that
> 1. The "union trick" has always worked with GCC, and is now hallowed
> by the standard.  So it sounds like GCC might change in the future.

Why?

Your statement that the trick "is now hallowed by the standard" makes it sounds like at some point GCC won't guarantee it work anymore.


> 2. Somewhere in the code that might manipulate the buffer via
> somehow casted packed C struct.  Hence, any compiler is unlikely
> able to avoid making call if memcpy() is used.

I don't understand what you mean by this.  You can always write a
function which takes a pointer to a character type and calls memcpy()
to copy it into any scalar type, and it won't unnecessarily call
anything; or if it does that's a missed-optimization bug.


Sorry, it is a typo -- I mean "compiler is unlikely able to avoid making *a copy* if memcpy() is used".

Using the unsafe reinterpret_cast (C fashion cast), it won't have an extra copy.  Using memcpy(), the compiler will have to make a copy because it sees that few lines, for example, down, the program tries to manipulate the copy.


> Then, I have the following questions:
> A. I use GCC and portability isn't an issue.  What is the best type
> punning method to achieve lowest latency?

A union.  You need a union to guarantee alignment.



So I guess there is no way to avoid a copy if the code manipulates the member of the union, right?

I understand that union and memcpy() would guarantee alignment.  I was just hoping that there is a way of guaranteeing alignment without an extra copy.  Sounds like there is no way?



> B. Let's say portability is important.  What's the best type punning
> method to achieve lowest latency?  It seems like memcpy() is the
> only choice?

A union.  In practice, this seems to work everywhere.  If you are
really standards-pedantic, use memcpy().




Andrew.


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