Articles of rigoroso aliasing

Il puntatore punteggiato di Dereferencing interromperà le regole di aliasing severo

Ho usato il seguente pezzo di codice per leggere i dati da file come parte di un programma più grande. double data_read(FILE *stream,int code) { char data[8]; switch(code) { case 0x08: return (unsigned char)fgetc(stream); case 0x09: return (signed char)fgetc(stream); case 0x0b: data[1] = fgetc(stream); data[0] = fgetc(stream); return *(short*)data; case 0x0c: for(int i=3;i>=0;i–) data[i] = […]

Esiste una differenza (semantica) tra il valore di ritorno del posizionamento nuovo e il valore casted del suo operando?

Esiste una differenza (semantica) tra il valore di ritorno del posizionamento nuovo e il valore casted del suo operando? struct Foo { … }; char buffer[…]; Foo *a = new(buffer) Foo; Foo *b = reinterpret_cast(buffer); A e b differiscono in qualche modo? EDIT: basato sul commento di DaBler, questa domanda indica che c’è una differenza, […]

Questo rompe davvero le regole di aliasing severo?

Quando compilo questo codice di esempio usando g ++, ottengo questo avvertimento: avvertimento: il puntatore di tipo punteggiato per il dereferenziamento interromperà le regole di aliasing severo [-Wstrict-aliasing] Il codice: #include int main() { alignas(int) char data[sizeof(int)]; int *myInt = new (data) int; *myInt = 34; std::cout << *reinterpret_cast(data); } In questo caso, i data […]

È 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, […]