Was ist der Unterschied zwischen sizeof und alignof?
Was ist der Unterschied zwischen sizeof und alignof?
#include <iostream>
#define SIZEOF_ALIGNOF(T) std::cout<< sizeof(T) << '/' << alignof(T) << std::endl
int main(int, char**)
{
SIZEOF_ALIGNOF(unsigned char);
SIZEOF_ALIGNOF(char);
SIZEOF_ALIGNOF(unsigned short int);
SIZEOF_ALIGNOF(short int);
SIZEOF_ALIGNOF(unsigned int);
SIZEOF_ALIGNOF(int);
SIZEOF_ALIGNOF(float);
SIZEOF_ALIGNOF(unsigned long int);
SIZEOF_ALIGNOF(long int);
SIZEOF_ALIGNOF(unsigned long long int);
SIZEOF_ALIGNOF(long long int);
SIZEOF_ALIGNOF(double);
}
Ausgabe
1/1
1/1
2/2
2/2
4/4
4/4
4/4
4/4
4/4
8/8
8/8
8/8
Denke ich, dass ich nicht das bekommen, was die Ausrichtung ist...?
- versuchen Sie, diese wieder mit structs statt der nativen Typen.
Returns alignment in bytes (an integer power of two) required for any instance of the given type
- en.cppreference.com/w/cpp/language/alignof.sizeof
gibt nur die Größe, in bytes, natürlich.- Vielleicht erwähnenswert - sizeof ist immer ein Vielfaches von alignof
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, "Speicher" ist im Grunde ein riesiges array von bytes. Jedoch, die meisten größeren Dinge wie Ganzzahlen benötigen Sie mehr als 1 byte zu speichern -- ein 32-bit-Wert, zum Beispiel, verwenden würde, die folgenden 4 Byte Speicher.
Nun, die Speichermodule in Ihrem computer nicht in der Regel "bytes"; Sie sind auch organisiert mit ein paar bytes "parallel", wie Blöcke von 4 bytes.
Für eine CPU, ist es viel besser = effizienter = besser Leistung, nicht "cross" solche block-Grenzen beim Lesen so etwas wie eine Ganzzahl:
Dies ist, was die "Ausrichtung", sagt: ein alignment von 4 bedeutet, dass die Daten dieser Art sollten (oder müssen, hängt von der CPU) abgelegt werden, beginnend bei einer Adresse, die ein Vielfaches von 4 sein.
Sie die Beobachtung, dass sizeof==alignof ist falsch; versuchen, Strukturen. Diese Strukturen werden auch ausgerichtet werden (weil Ihre einzelnen Mitglieder benötigen, um am Ende auf die richtigen Adressen), aber Ihre Größe viel größer.
Den beiden Operatoren sind grundsätzlich verschiedene Dinge.
sizeof
gibt die Größe eines Typs (wie viel Speicher es nimmt) in der Erwägung, dassalignof
gibt, was, wie viele bytes, die ein Datentyp muss ausgerichtet werden. Es passiert einfach so, dass die primitiven, die Sie getestet haben, eine Angleichung Voraussetzung die gleiche wie die Größe (was Sinn macht, wenn man darüber nachdenkt).Darüber nachdenken, was passiert, wenn ein struct statt:
alignof(Foo)
zurück 4.alignof
?alignof(Foo)
zurück 4. Aber es ist abhängig von der Ziel-ABI. Also das könnte wahr sein, auf ia32 (x86), aber nicht auf ARM, MIPS, PowerPC, etc.Alte Frage (obwohl nicht gekennzeichnet als beantwortet..), aber dachte, das Beispiel macht den Unterschied ein bisschen deutlicher neben Christian Stieber Antwort. Auch Meluha Antwort enthält einen Fehler, da sizeof(S) Ausgabe 16 nicht 12.
Es zeigt auch, dass es am besten ist Bestellung von Mitgliedern durch die Größe mit den größten ersten (Doppel-in diesem Fall), wie die anderen Mitglieder gezwungen sind, von diesem Mitglied.
Für die Antworten, es scheint einige Verwirrung darüber, was Ausrichtung eigentlich ist. Die Verwirrung, die wahrscheinlich entsteht, weil es gibt 2 Arten von alignment.
1. Member alignment
Dies ist eine qualitative Kennzahl, die beschreibt, wie groß eine Instanz ist in der Anzahl der bytes, die für eine bestimmte Bestellung der Mitglieder innerhalb die Struktur/Klasse Typ. Generell Compiler die kompakte Struktur/Klasse Instanzen, wenn die Mitglieder bestellt werden durch Ihre byte-Größe in absteigender Reihenfolge (d.h. der größten ersten, kleinsten Mitglieder Letzte) innerhalb der Struktur. Bedenken Sie:
Beide Strukturen enthalten genau die gleichen Informationen. Aus Gründen der diesem Beispiel; der float-Typ mit 4 Byte, short Typ 2 und der Zeichen ist 1 byte. Jedoch, die erste Struktur Eines hat Mitglieder in einer zufälligen Reihenfolge, während die zweite Struktur B Aufträge die Mitglieder nach Ihrer Größe in byte (dies kann anders sein, die auf bestimmten Architekturen, gehe ich davon aus x86-intel-CPU-Architektur mit 4-byte-Ausrichtung in diesem Beispiel). Betrachten wir nun die Größe der Strukturen:
Wenn man erwarten würde, mit der Größe von 7 bytes, Sie wäre unter der Annahme, dass die Mitglieder verpackt in die Struktur mit einem 1-byte-Ausrichtung. Während einige Compiler dies zulassen, im Allgemeinen sind die meisten Compiler nutzen Sie den 4-byte oder 8-byte-alignments aufgrund von historischen Gründen (die meisten CPU ' s arbeiten mit DWORD (double-word) oder QWORD (quad word) general purpose Register).
Gibt es 2 Polsterung Mechanismen bei der Arbeit zu erreichen, die Verpackung.
Erste, jedes Mitglied hat eine byte-Größe, die kleiner als die byte-Ausrichtung ist 'verschmolzen' mit dem nächsten Mitglied(s), wenn die daraus resultierende byte-Größe ist kleiner oder gleich der byte-Ausrichtung. In Struktur B, die Mitglieder der s-und c zusammengefasst werden können, auf diese Weise; Ihre kombinierte Größe ist 2 bytes für s + 1 byte für c == 3 bytes <= 4-byte-Ausrichtung. Für die Struktur Ein, keine solchen Zusammenführung kommen kann, und jedes Mitglied, effektiv verbraucht 4 bytes in die Struktur der Verpackung.
Die Gesamtgröße der Struktur ist wieder aufgefüllt, so dass die nächste Struktur können am Ausrichtungsgrenze. In Beispiel B die Gesamtanzahl von bytes wäre 7. Die nächste 4-byte-Grenze liegt bei byte 8, daher die Struktur ist gepolstert und mit 1 byte zu ermöglichen array-Zuweisungen als Feste Abfolge von Instanzen.
Beachten Sie, dass Visual C++ /GCC erlauben, unterschiedliche Ausrichtungen von 1 byte, 2 und höhere Vielfache von 2 bytes. Verstehen Sie, dass dies gegen Ihren compiler die Fähigkeit zur Herstellung von optimalen code für Ihre Architektur. In der Tat, im folgenden Beispiel, jedes byte wird gelesen als ein einzelnes byte mit einem single-byte-Anweisung für jede lese-operation. In der Praxis wäre die hardware noch Holen wird der gesamte Speicher-Zeile, die enthält jedes byte Lesen in den cache, und führen Sie die Anweisung, 4 mal, auch wenn die 4 bytes, die sitzen in der gleichen DWORD und geladen werden konnte in der CPU-register in 1 Anleitung.
2. Zuordnung Ausrichtung
Dies ist eng mit der 2. Polsterung Mechanismus im vorherigen Abschnitt erläutert, allerdings Zuordnung Ausrichtungen kann angegeben werden, in Variante (N) der malloc/memalloc Zuweisung von Funktionen, z.B. calloc. Daher ist es möglich, die Zuweisung eines Objekts an eine andere (in der Regel höhere Vielfache von 2) Ausrichtung Begrenzung als die Struktur/Objekt-Typ byte-Ausrichtung vermuten lässt.
Den code wird das blockieren der Anzahl Instanzen vom Typ T auf Adressen, die auf ein Vielfaches von 4096.
Den Grund für die Verwendung dieser Zuordnung Ausrichtungen sind wieder rein architektonische. Zum Beispiel Lesen und schreiben von Blöcken von Seite ausgerichtet-Adressen ist schneller, da der Bereich von Adressen, die passen gut in die cache-Ebenen. Bereiche aufgeteilt auf verschiedene "Seiten" trash cache beim überschreiten der page-Grenze. Verschiedene Medien (bus-Architekturen) haben unterschiedliche Zugriffsmuster und profitieren von verschiedenen Ausrichtungen. Im Allgemeinen Ausrichtungen von 4, 16, 32 und 64 K-Seite Größen sind keine Seltenheit.
Den alignof Wert ist der gleiche wie der Wert für sizeof, die für die basic-Typen.
Der Unterschied liegt in den verwendeten definierten Datentypen wie die Verwendung von struct; für z.B.
daher den sizeof-Wert ist der Gesamt benötigte Größe für den angegebenen Datentyp;
und alignof Wert ist die Ausrichtung Anforderung an das größte element in der Struktur.
Verwendung von alignof : reservieren Sie Speicher auf einer bestimmten Ausrichtung Begrenzung.
sizeof
immer folgt die Einschränkungsizeof(Type) % alignof(Type) == 0
. Wenn die Ausrichtung ist in der Tat 8 bytes, dann ist die Größe liegt bei mindestens 16 bytes. Das Polster ist garantiert, um zu geschehen.Den
sizeof
- operator gibt die Größe in bytes des aktuellen Typs oder der Instanz eines Typs.Den
alignof
- operator gibt Sie das alignment in bytes erforderlich, die für jede Instanz des gegebenen Typs.Sind beide Operatoren. Beide geben eine Art von
size_t
.sizeof
ist die Größe in "bytes" von der Objekt - Speicher benötigten Speicherplatz zu codieren.alignof
ist die Adresse Angleichung Voraussetzung in "bytes" des Objekts. Ein Wert von 1 bedeutet keine Ausrichtung Einschränkung. 2 impliziert die Adresse sollte eine gerade Adresse. 4 impliziert, dass die Adresse sollte ein quad Adresse. etc.Wenn eine Referenz auf ein Objekt versucht wird, das nicht die Angleichung Voraussetzung, das Ergebnis ist Undefiniertes Verhalten.
Beispiele:
. Der Zugriff funktioniert, nur langsamer.
. Der Zugriff kann töten das Programm.
Beispiel der ausbau und die Ausgabe von OP-code.