CPUs erfordern oft, dass (oder effizienter arbeiten, wenn) bestimmte Arten von Daten werden an den Adressen gespeichert, die ein Vielfaches von einigen (power-of-two) Wert. Dieser Wert wird als Ausrichtung der Daten bezeichnet. Zum Beispiel könnte eine CPU erfordern, dass Vier-Byte-Ganzzahlen werden an den Adressen gespeichert, die ein Vielfaches von vier sind (dass sie Vier-Byte-Ausrichtung oder sind ausgerichtet auf vier Bytes haben).
Von der restriktivste Typ, bedeuten sie den Typ, der die restriktivsten Anforderungen in diesem Bereich hat. Wenn also z.B. long double
Acht-Byte-Ausrichtung auf einige Maschine erfordert, und keine andere Art erfordert eine größere Ausrichtung als das, dann die restriktivste Art auf dieser Maschine long double
wäre.
Es ist sinnvoll, für malloc(3)
Adressen zurückzugeben, die die Ausrichtungsanforderungen des restriktivsten Typs erfüllen, da dies bedeutet, dass der zurückgegebene Speicher zum Speichern eines beliebigen Typs verwendet werden kann. malloc()
weiß nicht, wie der Speicher verwendet wird, damit er sich nicht anpassen kann.
Es ist nicht unbedingt der Fall, dass größere Datentypen größer Ausrichtung erfordern, obwohl Anforderungen Ausrichtung neigen dazu, mit zunehmender Größe zu erhöhen.
(Einige Arten von Daten könnte sogar größer Ausrichtung erfordern, als malloc()
bereitstellt. Zum Beispiel sind viele x86 SSE Befehle verwenden Datenvektoren, die auf 16 Bytes ausgerichtet sind, während zB der malloc()
in glibc nur acht-Byte-Ausrichtung gewährleistet. posix_memalign(3)
kann verwendet werden, um Speicher mit noch größeren Ausrichtungsanforderungen auf POSIX (* nix) -Systemen dynamisch zuzuweisen.)
Definieren Sie eine Union aller Typen und sehen Sie die Größe der Union, um den restriktivsten Typ zu finden – BsD
@BsD - das gibt Ihnen den größten Typ. Es kann oder darf nicht die restriktivste sein. –