natknąłem kod podobny do poniższego dzisiaj i jestem ciekaw, co się rzeczywiście dzieje:Czym jest przesunięcie regionów wykonawczych i sekcji wejściowych?
#pragma pack(1)
__align(2) static unsigned char multi_array[7][24] = { 0 };
__align(2) static unsigned char another_multi_array[7][24] = { 0 };
#pragma pack()
Podczas poszukiwania odniesieniem do __align słów kluczowych w kompilator Keil, natknąłem się na to:
Overalignment regionów wykonanie i sekcjach wejściowych Istnieją sytuacje, kiedy chcesz overalign sekcje kodu i danych ... Jeśli masz dostęp do oryginalnego kodu źródłowego, można zrobić to w czasie kompilacji z __align (n) słowo kluczowe ...
Nie rozumiem, co rozumie się przez "przesuwanie kodu i sekcji danych". Czy ktoś może pomóc w wyjaśnieniu, w jaki sposób występuje ta różnica?
Może się przydać Overalighment na ARM. Instrukcja "load natychmiast" (MOV) nie może załadować całej 32-bitowej wartości. Zamiast tego może załadować 8 bitów naraz, obróconych do dowolnej pozycji. Z tego powodu twój kod może próbować spowodować, że adres zakończy się na więcej zerowych bitów, co ułatwia/przyspieszy skompilowany kod, aby załadować do niego wartość wskaźnika. –