public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Hei Chan <structurechart@yahoo.com>
To: Andrew Haley <aph@redhat.com>,
	 "gcc-help@gcc.gnu.org" <gcc-help@gcc.gnu.org>
Subject: Re: is portable aliasing possible in C++?
Date: Mon, 15 Sep 2014 11:07:00 -0000	[thread overview]
Message-ID: <1410779226.12412.YahooMailNeo@web165006.mail.bf1.yahoo.com> (raw)
In-Reply-To: <5416A4E1.1010000@redhat.com>




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.

  reply	other threads:[~2014-09-15 11:07 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-10 23:03 haynberg
2014-09-11  8:11 ` Andrew Haley
2014-09-11 23:25   ` haynberg
2014-09-12  8:32     ` Andrew Haley
2014-09-12 22:58       ` haynberg
2014-09-13  7:23         ` Andrew Haley
2014-09-13 11:45           ` Oleg Endo
2014-09-15  2:37           ` Hei Chan
2014-09-15  8:35             ` Andrew Haley
2014-09-15 11:07               ` Hei Chan [this message]
2014-09-15 11:21                 ` Andrew Haley
2014-09-15 11:29                   ` Hei Chan
2014-09-15 11:32                     ` Andrew Haley
2014-09-15 11:57                       ` Hei Chan
2014-09-15 13:21                         ` Andrew Haley
2014-09-15 13:31                           ` Hei Chan
2014-09-15 14:11                             ` Andrew Haley
2014-09-15 11:27                 ` Jonathan Wakely
2014-09-15 12:09                   ` Paul Smith
2014-11-02 23:55       ` Hei Chan
2014-11-03  9:34         ` Andrew Haley
  -- strict thread matches above, loose matches on Subject: below --
2014-09-09 23:13 haynberg
2014-09-10  8:17 ` Andrew Haley
     [not found] <A76FB9DDEDFA994BAF6B77704A4AF465BC2464@xchmbbal502.ds.susq.com>
2014-09-04 16:11 ` Andy Webber
2014-09-04 16:51   ` Andrew Haley
2014-09-04 17:18     ` Andy Webber
2014-09-04 17:23       ` Andrew Haley
2014-09-04 17:44         ` Andy Webber
2014-09-04 17:47           ` Andy Webber
2014-09-04 17:48           ` Andrew Haley
2014-09-04 23:11     ` Jonathan Wakely
2014-09-05  7:16       ` Andrew Haley
2014-09-05 14:19       ` Jason Merrill
2014-09-08  9:33         ` Richard Biener
2014-09-10 14:31           ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1410779226.12412.YahooMailNeo@web165006.mail.bf1.yahoo.com \
    --to=structurechart@yahoo.com \
    --cc=aph@redhat.com \
    --cc=gcc-help@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).