Articles of type punning

bit mobili e aliasing rigoroso

Sto cercando di estrarre i bit da un float senza invocare un comportamento indefinito. Ecco il mio primo tentativo: unsigned foo(float x) { unsigned* u = (unsigned*)&x; return *u; } A quanto ho capito, non è garantito che funzioni a causa delle rigide regole di aliasing, giusto? Funziona se si fa un passo intermedio con […]

strutture di unione “punning” con “sequenza iniziale comune”: perché C (99+), ma non C ++, stabilisce una “dichiarazione visibile del tipo di unione”?

sfondo Le discussioni sulla natura per lo più non implementata o definita del tipo punire tramite union tipicamente citano i seguenti bit, qui tramite @ecatmur ( https://stackoverflow.com/a/31557852/2757035 ), su un’esenzione per lo standard -struttura di visualizzazione con una “sequenza iniziale comune” di tipi di membri: C11 ( 6.5.2.3 Struttura e membri del sindacato ; Semantica […]

È consentito l’aliasing T * con char *. È permesso anche il contrario?

Nota: questa domanda è stata rinominata e ridotta per renderla più mirata e leggibile. La maggior parte dei commenti si riferisce al vecchio testo. Secondo lo standard, oggetti di diverso tipo potrebbero non condividere la stessa posizione di memoria. Quindi questo non sarebbe legale: std::array shorts; int* i = reinterpret_cast(shorts.data()); // Not OK Lo standard, […]

Qual è un modo corretto per digitare un float su un int e viceversa?

Il codice seguente esegue un’operazione di radice quadrata inversa rapida con alcuni hack. L’algoritmo è stato probabilmente sviluppato da Silicon Graphics nei primi anni ’90 ed è apparso anche in Quake 3. Ulteriori informazioni Tuttavia ricevo il seguente avviso dal compilatore GCC C ++ : il puntatore con punteria di tipo dereferencing interromperà le regole […]

Qual è la regola rigorosa di aliasing?

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?