Es gibt so viele verschiedene Prozessormodelle, die ich nur theoretisch und allgemein beantworten werde.
Betrachten Sie ein Array von 16-Byte-Objekten, das an einer Adresse beginnt, die ein Vielfaches von acht Byte, aber nicht von 16 Byte ist. Nehmen wir an, der Prozessor hat einen 8-Byte-Bus, wie in der Frage angegeben, auch wenn einige Prozessoren dies nicht tun. Beachten Sie jedoch, dass an einem Punkt im Array eines der Objekte eine Seitenbegrenzung überspannen muss: Die Speicherzuordnung funktioniert normalerweise in 4096-Byte-Seiten, die an 4096-Byte-Grenzen beginnen. Bei einem acht Byte ausgerichteten Array beginnt ein Element des Arrays bei Byte 4088 einer Seite und geht bis zum Byte 7 der nächsten Seite weiter.
Wenn ein Programm versucht, das 16-Byte-Objekt zu laden, das eine Seitengrenze überschreitet, kann es keine einzelne virtuelle-physische Speicherzuordnung mehr ausführen. Es muss eine Suche nach den ersten acht Bytes und eine weitere Suche nach den zweiten acht Bytes durchführen. Wenn die Lade-/Speichereinheit nicht dafür ausgelegt ist, benötigt die Anweisung eine spezielle Handhabung. Der Prozessor könnte seinen anfänglichen Versuch, den Befehl auszuführen, abbrechen, ihn in zwei spezielle Mikrobefehle aufteilen und diese zur Ausführung in die Befehlswarteschlange zurückschicken. Dies kann den Befehl um viele Prozessorzyklen verzögern.
Darüber hinaus interagiert, wie Hans Passant bemerkte, Alignment mit Cache. Jeder Prozessor hat einen Speichercache, und es ist üblich, dass der Cache in 32-Byte- oder 64-Byte- "Zeilen" organisiert ist. Wenn Sie ein 16-Byte-Objekt laden, das 16 Byte ausgerichtet ist und das Objekt im Cache ist, kann der Cache eine Cachezeile bereitstellen, die die erforderlichen Daten enthält. Wenn Sie 16-Byte-Objekte aus einem Array laden, das nicht 16-Byte-ausgerichtet ist, werden einige der Objekte im Array zwei Cache-Zeilen spreizen. Wenn diese Objekte geladen werden, müssen zwei Zeilen aus dem Cache abgerufen werden. Dies kann länger dauern. Selbst wenn es nicht länger dauert, zwei Zeilen zu bekommen, vielleicht weil der Prozessor so ausgelegt ist, dass er zwei Cache-Zeilen pro Zyklus bereitstellt, kann dies andere Dinge beeinträchtigen, die ein Programm ausführt. Üblicherweise lädt ein Programm Daten von mehreren Orten. Wenn die Lasten effizient sind, kann der Prozessor möglicherweise zwei gleichzeitig ausführen. Wenn jedoch eine von ihnen zwei Cache-Zeilen anstelle der normalen benötigt, blockiert sie die gleichzeitige Ausführung anderer Ladeoperationen.
Darüber hinaus erfordern einige Anweisungen explizit ausgerichtete Adressen. Der Prozessor könnte diese Anweisungen direkter versenden und einige der Tests, die Operationen ohne ausgerichtete Adressen reparieren, umgehen. Wenn die Adressen dieser Befehle aufgelöst sind und sich als falsch erwiesen haben, muss der Prozessor sie abbrechen, da die Reparaturoperationen umgangen wurden.
"Wie wir wissen, X86 CPU hat einen 64-Bit-Datenbus" - das ist nicht wahr. x86 sagt nichts über Datenbusgrößen aus. Moderne Prozessoren haben tatsächlich größere Datenbusbreiten als diese. – Mysticial
Prozessor liest keine Daten vom Datenbus, sie lesen es aus dem Cache. Eine 16-Byte-Ausrichtung ist erforderlich, um eine Überbrückung einer Cache-Zeilengrenze zu vermeiden. –
@Mysticial Ich denke, die beliebtesten x86 CPUs haben derzeit 64-Bit-Datenbus, nicht wahr? – iqapple