Jest tak wiele różnych modeli procesorów, na które zamierzam odpowiedzieć tylko w kategoriach teoretycznych i ogólnych.
Rozważmy tablicę 16-bajtowych obiektów rozpoczynającą się od adresu o wielokrotności ośmiu bajtów, ale nie o 16 bajtów. Załóżmy, że procesor ma ośmiobajtową magistralę, jak wskazano w pytaniu, nawet jeśli niektóre procesory tego nie robią. Należy jednak zauważyć, że w pewnym momencie w tablicy jeden z obiektów musi przechodzić przez granicę strony: Mapowanie pamięci zwykle działa na 4096-bajtowych stronach rozpoczynających się od granic 4096-bajtowych. W przypadku tablicy o ośmiu bajtach element tablicy zaczyna się od bajtu 4088 na jednej stronie i przechodzi do bajtu 7 na następnej stronie.
Gdy program próbuje załadować 16-bajtowy obiekt, który przekracza granicę strony, nie może już wykonywać pojedynczej mapy pamięci wirtualnej na fizyczną. Musi wykonać jedno wyszukiwanie dla pierwszych ośmiu bajtów i kolejne wyszukiwanie dla pozostałych ośmiu bajtów. Jeśli jednostka ładunkowa/magazynowa nie jest do tego zaprojektowana, wówczas instrukcja wymaga specjalnej obsługi. Procesor może przerwać pierwszą próbę wykonania instrukcji, podzielić ją na dwie specjalne mikroinstrukcje i wysłać je z powrotem do kolejki instrukcji w celu wykonania. Może to opóźnić instrukcję o wiele cykli procesora.
Ponadto, jak zauważył Hans Passant, wyrównanie współdziała z pamięcią podręczną. Każdy procesor ma pamięć podręczną pamięci i często pamięć podręczna jest zorganizowana w 32-bajtowe lub 64-bajtowe "linie". Jeśli załadujesz 16-bajtowy obiekt wyrównany do 16 bajtów, a obiekt znajduje się w pamięci podręcznej, pamięć podręczna może dostarczyć jedną linię pamięci podręcznej zawierającą potrzebne dane. Jeśli ładujesz 16-bajtowe obiekty z tablicy, która nie jest wyrównana do 16 bajtów, to niektóre z obiektów w tablicy będą zawierały dwie linie pamięci podręcznej. Po załadowaniu tych obiektów należy pobrać dwie linie z pamięci podręcznej. To może potrwać dłużej. Nawet jeśli nie zajmie to więcej czasu niż dwie linie, być może dlatego, że procesor jest zaprojektowany tak, aby zapewnić dwie linie pamięci podręcznej na cykl, może to wpływać na inne rzeczy wykonywane przez program. Zazwyczaj program ładuje dane z wielu miejsc. Jeśli obciążenia są wydajne, procesor może wykonać dwie operacje naraz. Ale jeśli jedna z nich wymaga dwóch linii pamięci podręcznej zamiast normalnej, blokuje równoczesne wykonywanie innych operacji ładowania.
Ponadto niektóre instrukcje wyraźnie wymagają wyrównania adresów. Procesor może wysłać instrukcje bezpośrednio, omijając niektóre testy, które naprawiają operacje bez wyrównanych adresów. Kiedy adresy tych instrukcji zostaną rozwiązane i okaże się, że są źle wyrównane, procesor musi je przerwać, ponieważ operacje naprawcze zostały pominięte.
"Jak wiemy, procesor X86 ma 64-bitową magistralę danych" - to nieprawda. x86 nie mówi nic o rozmiarach magistrali danych. Nowoczesne procesory mają w rzeczywistości większe szerokości magistrali danych. – Mysticial
Procesor nie odczytuje danych z magistrali danych, lecz odczytuje je z pamięci podręcznej. 16-bajtowe wyrównanie jest wymagane, aby uniknąć przekroczenia granicy linii pamięci podręcznej. –
@Mysticial Myślę, że najbardziej popularne procesory x86 obecnie mają 64-bitową magistralę danych, prawda? – iqapple