Wykonuję procedurę kopiowania bloku pamięci i zajmuję się blokami surowej pamięci w wydajnych porcjach. Moje pytanie nie dotyczy specjalnej procedury kopiowania, którą robię, ale w jaki sposób poprawnie sprawdzić wyrównanie surowego wskaźnika w C.Zatwierdzona składnia dla manipulowania przy użyciu surowego wskaźnika
Mam surową wskazówkę pamięci, załóżmy, że jest już rzutowany jako niezerowy znak * . W mojej architekturze mogę bardzo wydajnie kopiować pamięć w 64-bajtowych fragmentach, KIEDY ZOSTAŁO ZOSTAŁO UDZIAŁ W FORMIE 64 BYTE. Więc (standardowa) sztuczka polega na tym, że zrobię prostą kopię 0-63 bajtów "ręcznie" na głowie i/lub ogonie, aby przekształcić kopię z dowolnego znaku * o dowolnej długości na wskaźnik wyrównany do 64 bajtów z pewną liczbą wielokrotną o długości 64 bajtów.
Teraz pytanie brzmi: jak legalnie "zbadać" wskaźnik, aby określić (i manipulować) jego wyrównaniem? Oczywistym sposobem jest rzucić go do liczby całkowitej i po prostu badać bitów:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
Uwaga tu widzę, że alignedPointer nie wskazują na ten sam pamięci jako wskaźnik ... to jest „zaokrąglona w górę” wskaźnik, który mogę nazwać moją wydajną procedurą kopiowania, i poradzę sobie z każdym innym bajtem na początku ręcznie.
Ale kompilatory (uzasadnione) zwariują podczas rzutowania wskaźnika na liczbę całkowitą. Ale jak inaczej mogę badać i manipulować dolnymi bitami wskaźnika w C: LEGAL C? Idealnie, aby przy różnych kompilatorach nie otrzymywałem żadnych błędów ani ostrzeżeń.
Powinno być ok, o ile 'int' ma taki sam rozmiar jak typ wskaźnika. –
Możesz również rzucić okiem na http://stackoverflow.com/questions/1898153/how-to-determine-if-memory-is-aligned-testing-for-alignment-not-aligning/1898194 –
Ah, ale zakłada się, że wskaźniki są przechowywane w formacie binarnym z MSB do LSB. Co my mamy? * niezdefiniowane zachowanie! * (powiedziane w taki sam sposób, w jaki zabójcza broń mówi * odporność dyplomatyczna! *) To, że działa w rzeczywistym świecie, nie czyni go mniej nieokreślonym. ;-) –