Recientemente he estado trabajando en esta plataforma para la cual una base de código heredada emite una gran cantidad de advertencias de "fundición aumenta la alineación con N", donde N es el tamaño del objetivo del molde.Advertencia: el elenco aumenta la alineación requerida
struct Message
{
int32_t id;
int32_t type;
int8_t data[16];
};
int32_t GetMessageInt(const Message& m)
{
return *reinterpret_cast<int32_t*>(&data[0]);
}
Es de esperar que es obvio que una aplicación "real" sería un poco más complejo, pero el punto básico es que tengo los datos procedentes de algún lugar, saben que está alineado (porque necesito el id y tipo a alinear), y sin embargo recibo el mensaje de que el elenco está aumentando la alineación, en el caso de ejemplo, a 4.
Ahora sé que puedo suprimir la advertencia con un argumento para el compilador, y sé que puedo lanzar el bit entre paréntesis para anular * primero, pero realmente no quiero pasar por cada bit de código que necesita este tipo de manipulación (hay mucho porque cargamos mucho dat) un disco que no está en el disco, y que los datos vienen como búfers de carga para que podamos avanzar fácilmente con el puntero), pero ¿alguien puede darme otras ideas sobre este problema? Quiero decir, para mí parece una opción tan importante y común que no querría advertir, y si realmente existe la posibilidad de hacerlo mal, entonces suprimir la advertencia no va a ayudar. Finalmente, ¿no puede el compilador saber como yo sé cómo el objeto en cuestión está realmente alineado en la estructura, por lo que debería ser capaz de no preocuparse por la alineación en ese objeto particular a menos que se golpee un byte o dos?
¿Existe algún tipo de Pragma/Directiva embalado ¿su compilador admite para hacerle saber que la estructura está alineada x byte? –
"esta plataforma", no nos hagas adivinar. –
@ Hans- No puedo compartir detalles específicos de la plataforma. @ Michael: puedo dar la vuelta y comenzar a etiquetar las cosas como alineadas, lo cual empecé a hacer, pero el problema está en todas partes. La pregunta no es tanto "¿cómo lo soluciono?", Sino "por qué al compilador le importa tanto cuando tiene toda la información que necesita". P.ej. no advierte que podría estar desreferenciando a los otros miembros sin alinear ... –