[ub] Type punning to avoid copying

Jeffrey Yasskin jyasskin at google.com
Fri Jul 26 20:35:18 CEST 2013


On Fri, Jul 26, 2013 at 9:23 AM, Gabriel Dos Reis <gdr at cs.tamu.edu> wrote:
> Jeffrey Yasskin <jyasskin at google.com> writes:
>
> | On Fri, Jul 26, 2013 at 9:10 AM, Gabriel Dos Reis <gdr at cs.tamu.edu> wrote:
> | > Jeffrey Yasskin <jyasskin at google.com> writes:
> | >
> | > | On Fri, Jul 26, 2013 at 8:30 AM, Gabriel Dos Reis <gdr at cs.tamu.edu> wrote:
> | > | > Ion Gaztañaga <igaztanaga at gmail.com> writes:
> | > | >
> | > | > [...]
> | > | >
> | > | > | ¿How can we tell the compiler that a memory buffer is really a different
> | > | > | type?
> | > | >
> | > | > Invoke a constructor to turn the raw memory into an object of the
> | > | > desired type.
> | > |
> | > | Can you point to the wording that explains the behavior in that case?
> | >
> | > I am not sure I understand your request.  Ion wants to state a region of
> | > storage is of a given type.  The behavior after the contructor ran is
> | > what you get after running a constructor -- see section 12.1.
> |
> | Yeah, sorry. I mean, if I write:
> |
> | float f = 3.2f;
> | int* i = new(&f) int;
> | use(*i);
> |
> | where does it say what the value of '*i' is? I'm expecting
> | implementation-defined, but I don't know exactly where to look.
> |
> | Thanks,
> | Jeffrey
>
> The object at 'i' is constructed but not initialized, so its value is
> indeterminate.  See 5.3.4/15.

(Or C++14 5.3.4/17, I think)

Ah, that's too bad because it doesn't serve the purpose Ion was asking
about. He wanted a memory buffer with known contents to become the
object representation of an object of a particular type. If the object
post-construction has an indeterminate object representation instead,
he can't use a constructor to turn the raw memory into an object with
the desired value.

Howard, if Gaby's right that new(&memory) int; leaves the object with
indeterminate value even if 'memory' started with a defined value (and
I think he is), then that's the rule you're breaking when you
explicitly change the active member of your union and then read the
new member.


More information about the ub mailing list