[c] Qual è la regola rigorosa di aliasing?



Answers

La migliore spiegazione che ho trovato è di Mike Acton, Understanding Aliasing . Si concentra un pò sullo sviluppo di PS3, ma fondamentalmente è solo GCC.

Dall'articolo:

"L'aliasing rigoroso è un'ipotesi, fatta dal compilatore C (o C ++), che i riferimenti di dereferenziazione a oggetti di tipi diversi non faranno mai riferimento alla stessa posizione di memoria (cioè alias l'un l'altro)."

Quindi, in pratica se hai un int* punta a qualche memoria contenente un int e poi punti un float* a quella memoria e lo usi come float infrangi la regola. Se il tuo codice non rispetta questo, l'ottimizzatore del compilatore molto probabilmente romperà il tuo codice.

L'eccezione alla regola è un char* , che può indicare qualsiasi tipo.

Question

Quando si fa una domanda sul comportamento non definito comune in C , le anime sono più illuminate di quanto facesse riferimento alla rigida regola di aliasing.
Di cosa stanno parlando?




Aliasing rigoroso non consente tipi di puntatori diversi agli stessi dati.

Questo articolo dovrebbe aiutarti a comprendere il problema in dettaglio.




Digitare punire tramite cast di puntatore (al contrario di usare un'unione) è un importante esempio di rottura dell'aliasing rigoroso.




Aliasing rigoroso non si riferisce solo ai puntatori, influisce anche sui riferimenti, ne ho scritto un articolo per il wiki dello sviluppatore boost ed è stato così ben accolto che l'ho trasformato in una pagina sul mio sito Web di consulenza. Spiega completamente di cosa si tratta, perché confonde così tanto le persone e cosa fare al riguardo. Libro bianco aliasing rigoroso . In particolare, spiega perché i sindacati sono un comportamento rischioso per C ++ e perché l'utilizzo di memcpy è l'unica soluzione portatile su C e C ++. Spero che questo sia utile.




Related