Czy powinienem się martwić o wyrównanie podczas rzutowania wskaźnika?

W moim projekcie mamy taki fragment kodu:

// raw data consists of 4 ints
unsigned char data[16];
int i1, i2, i3, i4;
i1 = *((int*)data);
i2 = *((int*)(data + 4));
i3 = *((int*)(data + 8));
i4 = *((int*)(data + 12));

Rozmawiałem z moim kierownikiem technicznym, że ten kod może nie być przenośny, ponieważ próbuje rzucićunsigned char* do aint* który zazwyczaj ma bardziej rygorystyczne wymaganie dopasowania. Ale lider technologii mówi, że wszystko jest w porządku, większość kompilatorów pozostaje taka sama po rzuceniu i mogę po prostu napisać kod w ten sposób.

Szczerze mówiąc, nie jestem do końca przekonany. Po zbadaniu znalazłem kilka osób, które nie używają odlewów wskaźnikowych, jak wyżej, np.tutaj itutaj.

Oto moje pytania:

Czy NAPRAWDĘ bezpiecznie jest wyłuskać wskaźnik po rzuceniu w prawdziwym projekcie?Czy jest jakaś różnica między castowaniem w stylu C ireinterpret_cast?Czy jest jakaś różnica między C i C ++?

questionAnswers(7)

yourAnswerToTheQuestion