Sto eseguendo una routine di copia del blocco di memoria e ho bisogno di gestire blocchi di memoria grezza in blocchi efficienti. La mia domanda non riguarda la copia specializzata che sto facendo, ma come esaminare correttamente l'allineamento puntatore grezzo in C.Sintassi approvata per la manipolazione grezza del puntatore
Ho un puntatore raw di memoria, diciamo che è già lanciato come un char non nullo * . Nella mia architettura, posso copiare in modo molto efficiente la memoria in blocchi da 64 byte QUANDO È ALLINEATO A 64 byte. Quindi il trucco (standard) è che eseguirò una semplice copia di 0-63 byte "manualmente" alla testa e/o alla coda per trasformare la copia da un carattere arbitrario * di lunghezza arbitraria a un puntatore allineato a 64 byte con qualche multiplo di 64 byte di lunghezza.
Ora la domanda è: come legalmente "esaminate" un puntatore per determinare (e manipolare) il suo allineamento? Il metodo più ovvio è gettato in un intero e solo esaminare i bit:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
nota qui Mi rendono conto che alignedPointer non punta alla stessa memoria, come puntatore ... questo è il "rastrellamento" puntatore su cui posso richiamare la mia copia efficiente, e gestirò manualmente ogni altro byte all'inizio.
Ma i compilatori (giustamente) impazziscono a lanciare un puntatore in un numero intero. Ma in quale altro modo posso esaminare e manipolare i bit inferiori del puntatore in LEGAL C? Idealmente, con compilatori diversi non riceverei errori o avvisi.
Questo dovrebbe essere ok finchè 'int' ha le stesse dimensioni dei tipi di puntatore. –
Puoi anche dare un'occhiata a http://stackoverflow.com/questions/1898153/how-to-determine-if-memory-is-aligned-testing-for-alignment-not-aligning/1898194 –
Ah, ma si presuppone che i puntatori siano memorizzati in binario da MSB a LSB. Cosa abbiamo? * comportamento indefinito! * (detto nello stesso modo in cui il tipo di arma letale dice * immunità diplomatica! *) Solo perché funziona nel mondo reale non lo rende meno indefinito. ;-) –