2017-07-30 3 views
-3

My C++ CodeC++: Größe der Struktur?

#include <iostream> 
using namespace std ; 

struct Node { 
    int data ; 
    struct Node *next; 
}; 

int main(){ 
    struct Node *head = NULL; 
    struct Node *second = NULL; 
    cout << sizeof(struct Node); 
} 

Ausgang an Klemme

16 

Wie ist die Größe 16? Größe von int ist 4bytes. Wie kommt es, dass es mit 4 multipliziert wird? Kann bitte jemand detaillierte Berechnung geben? Danke!

+2

Ihre Struktur enthält mehr als nur einen int, plus padding/alignment. – VTT

+0

Können Sie erklären, wie es bis zu 16 Bytes macht? –

+1

* "Die Größe von int ist 4 Bytes." * - Zählen Sie nicht darauf, dass es immer wahr ist. Zählen Sie auch nicht auf Zeigergrößen, die 0 sind. – StoryTeller

Antwort

2

Ein int ist in der Tat 4 Bytes (mindestens in x86 64-Bit-Maschinen). Ein Zeiger (mindestens in 64-Bit-x64-Maschinen) ist 8 Bytes, so dass die Struktur theoretisch 12 Bytes hätte sein können. Es wird jedoch auf eine Multiplikation der nativen Wortgröße (8 Bytes) aufgefüllt - und die Schrank-Zusammenfassung von 12 Bytes wäre 16 Bytes.

+0

Eine ähnliche und leicht testbare Alternative, die OP kann eine Plattform verwenden, die 64-Bit-Zeiger verwendet und sie (Zeiger) auf 8-Byte-Grenzen residieren. Unter der Annahme, dass "int" tatsächlich vier Bytes auf der Plattform ist, würden diesen vier Bytes dann 4 Bytes des Auffüllens folgen, dann der 8-Byte-Zeiger. Eine kreative Adresse - die Verwendung der Mitglieder einer Instanz der Struktur - wäre hilfreich, um eine dieser Hypothesen zu testen. – WhozCraig

+2

Ihre Beschreibung ist irreführend, es gibt höchstwahrscheinlich keine Auffüllung am Ende der Struktur (aber einige in der Mitte). "padding to native word size" ist keine Voraussetzung für x86 64. – Mat

+0

Was ist eigentlich Padding? –

1

Die Strukturen sind auf die Größe des "größten Wortes" gepackt. Zum Beispiel, wenn Sie eine solche Struktur haben:

struct ThreeBytes { 
    char one; 
    short two; 
}; 

Seine Größe wird 4 Bytes sein, weil Feld one auf die Größe des Kurzschlusses aufgefüllt wird, das heißt, es wird nicht verwendet Byte danach abgelegt. Wenn two ein int wäre, wird die Struktur eine Größe von zwei int s haben. Dies geschieht, wenn Sie Ihre Struktur, dass ausrichten:

// this structure got size of 4 bytes. 
struct ThreeBytes { 
    char one; 
    char two; 
    short three; 
}; 

Und das ist unaligned ein:

// This structure will have size 6 
struct ThreeBytes { 
    char one; 
    short two; 
    char three; 
}; 

Dieses Standardverhalten ist, gibt Compiler-Direktiven sind, die Veränderungen ermöglichen Verpackung (siehe #pragma pack, zum Beispiel, Compilermittel können unterschiedlich sein). Im Wesentlichen können Sie die Einheit festlegen, auf welche Felder gepolstert werden soll, oder das Padding deaktivieren, indem Sie ihn auf 1 setzen. Aber einige Plattformen erlauben das überhaupt nicht.

+1

Der Name ThreeBytes ist etwas unglücklich für die letzten beiden Strukturen, aber ansonsten einige gute Beispiele. – Jonas

+0

@ Jonas war es absichtlich Wortspiel, es auch irreführend im ersten Fall, weil diese Struktur vier Bytes ist, äh, Zeichen lang. Einige Plattformen haben flexible Definition von Byte (das ist minimal adressierbare Einheit _currently_), die dieses Verhalten ausgelöst haben. – Swift

Verwandte Themen