2016-04-07 15 views
0

Dies ist die Strukturdeklarationsizeof Zeiger auf eine Struktur in c

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

Und wenn ich die folgende Zeile auszuführen, sollte die Größe der ptr2 12 Bytes sein (I verwenden 64-Bit-Maschine)?

struct node *ptr; 
    struct node ptr2; 
    printf("%u\n%u\n",sizeof(ptr),sizeof(ptr2)); 

Th Ausgang ist wie folgt:

[email protected]:~/Desktop$ ./a.out 
8 
16 
+0

Nein. Es sollte nicht. Zeiger sind 8-Byte-ausgerichtet auf x86-64. –

+0

@AnttiHaapala ptr2 ist kein Zeiger! – Spektre

+0

@Spektre ** next ** ist ein Zeiger. –

Antwort

-2

, der davon abhängt, was ausrichten Einstellungen, die Sie in Ihrem Compiler haben. Für align entscheidende struct ‚s (zum Beispiel für Datei-Format-Decodierung/Codierung Zwecke) versuchen, diese (in C++, wenn Sie die Dokumentation sehen anders haben, wie eine ähnliche Funktionalität zu erreichen):

#pragma pack(1) 
struct node 
{ 
int data; 
struct node *next; 
}; 
#pragma pack() 

In Ihrem Fall sieht es aus wie Sie haben auf 8 oder 16 Bytes ausgerichtet. Speicherzugriff durch eine bessere Adressieren math und weniger Cache-Fehltreffern Diese Eigenschaft wird verwendet, um Daten auszurichten, zu beschleunigen ...

  • #pragma pack(x) setzt vorübergehend align Eigenschaft auf x Bytes
  • #pragma pack() vorherigen align Einstellung wiederherzustellen.

Sie können diese als Push und Pop betrachten.

Das Align teilt dem Compiler mit, auf welche Größe struct/class/union ausgerichtet werden sollte, damit sie immer bei mehreren der align-Eigenschaftsadressen beginnen/enden. Dies ist wichtig für die Zeigerlogik. Wenn Sie beispielsweise auf 8 oder 16 ausgerichtet sind und Ihre Struktur eine Größe von 12 Byte hat, füllt der Compiler den Rest mit leerem Speicherplatz, um mehrere der Ausrichtungsgröße zu entsprechen (in Ihrem Fall fügen Sie 4 Byte hinzu). Dies führt zu weniger CACHE Fehlschüsse (wenn Ausrichtung groß genug für Ihre aktuelle CPU ist). Einige Compiler können auch davon profitieren (wenn die Größe 2 ist) und die Zeigermathematik in Bitverschiebungen ändern.

Versuchen in Ihrem IDE für Dinge wie zu suchen: Project->Options->Compiler->Align

Aber wie wenige von euch in einigen Architekturen un ausrichteZugriffsSpeicher wiesen darauf hin (wie SPARC) verboten ist und in der Regel endet mit Crash/Ausnahme auf.

+0

Dies funktionierte (ptr2 hatte 12 Bytes). Kannst du bitte näher erläutern was genau #pragma pack() macht? – djvu

+0

@kvmanohar hat weitere Informationen hinzugefügt – Spektre

Verwandte Themen