[ub] Type punning to avoid copying

Ion Gaztañaga igaztanaga at gmail.com
Fri Jul 26 20:33:27 CEST 2013


El 26/07/2013 18:10, Gabriel Dos Reis escribió:
> 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.

We don't want to run the constructor because the constructor might touch 
bytes that are already set by an external source, we want to tell the 
compiler that the object is already correctly constructed. Most C++ 
programmers expect this feature to be available in the language, because 
they have been using it for decades:

Example 1:

void *p = mmap(/**/);

//Mr. Compiler, believe me, a properly constructed
//object of type Class lives in address p
//(constructed by another process compiled with a
//compatible ABI)
Class *pt = reinterpret_cast<Class *>(p);

Example 2:

vector<char> network_packet(EthernetLength);

if(eth_controller_read(network_packet.data(), network_packet.size())){
    //Mr. Compiler, believe me, a properly constructed
    //object of type PacketUnion lives in address network_packet.data().
    PacketUnion *pt =
      reinterpret_cast<PacketUnion *>(network_packet.data());
}

Example 3:

//Mr. Compiler, believe me, a properly constructed
//object of type DeviceStatusStruct  lives in address 0x12345678.
volatile DeviceStatusStruct *pd =
   reinterpret_cast<volatile DeviceCtrlStruct*>(0x12345678);

----

And to complicate things a little bit, we would like a solution that is 
compatible with C, and C has no constructors. How can we solve this?

Best,

Ion


More information about the ub mailing list