¿Debo preocuparme por la alineación durante el lanzamiento del puntero?

En mi proyecto tenemos un código como este:

// 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));

Hablé con mi jefe de tecnología para que este código no sea portátil, ya que está tratando de lanzar ununsigned char* a unint* que por lo general tiene un requisito de alineación más estricto. Pero el líder de tecnología dice que está bien, la mayoría de los compiladores sigue teniendo el mismo valor de puntero después de la conversión, y puedo escribir el código de esta manera.

Para ser franco, no estoy realmente convencido. Después de investigar, encuentro a algunas personas en contra del uso de fundición de punteros como la anterior, por ejemplo,aquí yaquí.

Asi que aqui están mis preguntas:

¿Es REALMENTE seguro desreferenciar el puntero después de lanzar un proyecto real?¿Hay alguna diferencia entre el casting de estilo C yreinterpret_cast?¿Hay alguna diferencia entre C y C ++?

Respuestas a la pregunta(7)

Su respuesta a la pregunta