Ultimamente sto lavorando a questa piattaforma per la quale un codebase legacy emette un gran numero di avvisi di "cast aumenta l'allineamento richiesto a N", dove N è la dimensione della destinazione del cast.Avviso: il cast aumenta l'allineamento richiesto
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]);
}
Speriamo che sia ovvio che un'implementazione "reale" sarebbe un po 'più complesso, ma il punto fondamentale è che ho i dati provenienti da qualche parte, ho sanno che è allineato (perché ho bisogno del id e type per essere allineati), eppure ottengo il messaggio che il cast sta aumentando l'allineamento, nel caso di esempio, a 4.
Ora so che posso sopprimere l'avviso con un argomento al compilatore, e so che posso gettare il bit tra parentesi per annullare * prima, ma non voglio veramente passare attraverso ogni bit di codice che necessita di questo tipo di manipolazione (c'è molto perché cariciamo un sacco di dati una parte del disco, e che i dati arrivano come char buffer in modo che possiamo facilmente puntare-anticipo), ma qualcuno può darmi qualche altra idea su questo problema? Voglio dire, per me sembra un'opzione così importante e comune che non vorresti avvertire, e se c'è effettivamente la possibilità di sbagliare, sopprimere l'avvertimento non aiuterà. Infine, il compilatore non può sapere come faccio a fare in modo che l'oggetto in questione sia effettivamente allineato nella struttura, quindi dovrebbe essere in grado di non preoccuparsi dell'allineamento su quell'oggetto particolare a meno che non sia stato colpito un byte o due?
C'è una sorta di pragma/direttiva imballato il tuo compilatore supporta per far sapere che la struttura è allineata con x-byte? –
"questa piattaforma", non farci indovinare. –
@ Hans- Non posso condividere dettagli specifici della piattaforma. @ Michael- Posso andare in giro e iniziare a taggare le cose come allineate, cosa che ho iniziato a fare, ma il problema è ovunque. La domanda non è tanto "come la risolvo", ma piuttosto "perché il compilatore si preoccupa così tanto quando ha tutte le informazioni di cui ha bisogno". Per esempio. non avverte che potrei dereferenziare gli altri membri non allineati ... –