2015-03-07 7 views
11

Das Buch Die Programmiersprache C spricht über „den restriktivsten Typ“ in Abschnitt 8.7, Beispiel — A Lagerung Allocator:Was ist mit dem restriktivsten Typ in C gemeint?

Obwohl Maschinen dort für jede Maschine variieren, ist ein restriktivsten Typ : Wenn der restriktivste Typ unter einer bestimmten Adresse gespeichert werden kann, können auch alle anderen Typen vorhanden sein. Auf einigen Maschinen ist der restriktivste Typ ein double; bei anderen genügt int oder long.

in ihrem Code wird die unionheader ausgerichtet long den Typen verwenden.

Was von der restriktivsten Art gemeint? Ist es vielleicht der größte Typ (z. B. double) oder gibt es einen anderen Ansatz?

+1

Definieren Sie eine Union aller Typen und sehen Sie die Größe der Union, um den restriktivsten Typ zu finden – BsD

+1

@BsD - das gibt Ihnen den größten Typ. Es kann oder darf nicht die restriktivste sein. –

Antwort

13

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.)

2

Ich denke, dass das Zitat die restriktivste Ausrichtung der Typen bedeutet. Zum Beispiel ist char der am wenigsten restriktive Typ, wenn man dieser Logik folgt. Ein Objekt vom Typ char erlegt seiner Ausrichtung keine Beschränkung auf, während zum Beispiel der Typ int eine Ausrichtungsanforderung von normalerweise 4 Byte Grenzen hat. Daher ist int ein restriktiverer Typ als char.

4

Der restriktivste Typ wird durch max_align_t definiert, der in stddef.h definiert ist.Gemäß dem Standard:

Eine grundsätzliche Ausrichtung durch eine Ausrichtungs dargestellt ist kleiner oder gleich die größte Ausrichtung durch die Umsetzung in allen Kontexten unterstützt, die zu _Alignof (max_align_t) gleich ist.

So max_align_t hat eine Ausrichtung, die mindestens so groß wie die eines jeden skalaren Typ ist, und in den meisten Implementierungen wird seine Ausrichtung auf den größten Skalartyp gleich sein - aber diese Gleichheit ist nicht erforderlich durch Der Standard.

Der Standard verlangt ferner (emphasis mir):

Die Reihenfolge und die Kontiguität der Lagerung durch aufeinanderfolgende Anrufe die aligned_alloc zugeordnet, calloc, malloc und realloc Funktionen ist unspezifiziert. Der Zeiger zurückgegeben, wenn die Zuweisung erfolgreich ist geeignet ausgerichtet, so dass es kann ein Zeiger auf einen beliebigen Typ Objekt mit einer grundlegenden Ausrichtung Anforderung zugewiesen und dann auf Zugriff auf ein solches Objekt oder ein Array von solchen Objekten in der Leerzeichen zugewiesen (bis der Speicherplatz explizit freigegeben ist).

So jeder Zeiger von Zuordnungsfunktionen zurückgeführt wird mindestens so streng wie die Ausrichtung von max_align_t ausgerichtet ist.

+2

@downvoter Pflege zu erklären? –

+0

Ich bin nicht der Downvoter, aber vielleicht wollten sie einen höheren Überblick über das Konzept der Ausrichtung Anforderungen von Typen. Das Eintauchen in 'max_align_t' und Passagen aus dem Standard könnte etwas übertrieben sein, bevor du diesen Teil bekommst. – Ulfalizer

+1

@Ulkalizer Fair genug, aber das rechtfertigt keinen Downvote. Die Frage war mir nicht ganz klar, und meine Antwort war speziell auf die Frage ausgerichtet: Was ist der restriktivste Typ, vielleicht die größte Schriftgröße (z doppelt) oder es gibt einen anderen Ansatz "Teil der Frage. –