Possiamo osservare la rappresentazione di un oggetto di tipo T
convertendo un T*
che punta a quell'oggetto in un char*
. Almeno nella pratica:Quando e come è consentita la conversione in puntatore char?
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
Emette la rappresentazione di 511
sul mio sistema: ff 01 00 00
.
C'è (sicuramente) un comportamento definito dall'implementazione che si verifica qui. Quale dei cast mi consente di convertire un int*
in un unsigned char*
e quali conversioni comporta tale cast? Sto invocando un comportamento indefinito non appena lancio? Posso trasmettere qualsiasi tipo di T*
in questo modo? Su cosa posso contare quando lo faccio?
non credo che sia un comportamento indefinito, almeno se non modifichi i dati.Ma il risultato dipenderà dal fatto che la tua piattaforma sia piccola o grande endian. – Synxis
Si noti che questo è sicuro solo per 'char *'. Puntatori del cast per farli leggere come tipi diversi causa problemi con * aliasing *. I linguaggi C e C++ garantiscono al compilatore che puntatori a tipi diversi non possono mai puntare allo stesso oggetto in modo che l'ottimizzatore possa fare cose come memorizzare il valore in un registro o caricare un carico o scrivere un ciclo. 'char *' è l'unica eccezione. Un 'char *' deve essere assunto come alias con qualsiasi cosa, a causa della serializzazione da e verso i buffer del disco e della rete. –
@ZanLynx - Re "' char * 'è l'unica eccezione": non del tutto. Lo standard consente anche la conversione in 'char senza segno *'. –