public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Wakely <jwakely.gcc@gmail.com>
To: Andrew Haley <aph@redhat.com>
Cc: Andy Webber <andy@aligature.com>, gcc-help <gcc-help@gcc.gnu.org>
Subject: Re: is portable aliasing possible in C++?
Date: Thu, 04 Sep 2014 23:11:00 -0000	[thread overview]
Message-ID: <CAH6eHdQxUNL0EbKJpT+qWfq_0py4eGQjqSKG99hjcWn3CBgOTg@mail.gmail.com> (raw)
In-Reply-To: <5408988E.2060301@redhat.com>

On 4 September 2014 17:51, Andrew Haley wrote:
> The "union trick" has always worked with GCC, and is now hallowed by
> the standard.  It's also easy to understand.  It generates code as
> efficient as all the other ways of doing it, AFAIAA.  It's what we
> have always recommended.

Type punning with unions is allowed in C since C99 but not by any C++
standard (although it does work with GCC).

Placement new might work with GCC in practice as long as the buffer is
correctly aligned and the type being constructed does not have
non-trivial initialization. However, my reading of the standard is
that after the placement new, if the object's members are not
initialized then they have indeterminate values (not the values that
were at those memory addresses already, even though that's likely to
be what happens in practice). Objects with indeterminate values can
only be used in very limited ways and generally lead to undefined
behaviour, and code with undefined behaviour does not usually mix well
with aggressive optimizations.

FWIW I prefer the memcpy approach, it usually generates the same code
as type punning via a union, but is more portable and has guaranteed
results that are well-defined (and if you're interested in maximum
performance then you should not be using unoptimized code, so it
shouldn't matter that the mempcy solution relies on optimizations).

  parent reply	other threads:[~2014-09-04 23:11 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [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 [this message]
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
2014-09-09 23:13 haynberg
2014-09-10  8:17 ` Andrew Haley
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
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

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=CAH6eHdQxUNL0EbKJpT+qWfq_0py4eGQjqSKG99hjcWn3CBgOTg@mail.gmail.com \
    --to=jwakely.gcc@gmail.com \
    --cc=andy@aligature.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).