Betrachten Sie den folgenden Code:
%Vor% Ausgabebeispiel:
ce1: Größe = 4, Adresse: 0039FAA0
ce2: Größe = 4, Adresse: 0039FA94
ceArr [0]: Größe = 4, Adresse: 0039FA84
ceArr [1]: Größe = 4, Adresse: 0039FA88
Mit dem Code gibt es ein 12-Byte zwischen den Adressen der ersten zwei Objekte (ce1 und ce2), aber es gibt nur eine 4-Byte-Differenz zwischen den Objekten im Array.
Ich dachte, die Datenausrichtung hätte etwas mit dem Problem zu tun, aber ich bin immer noch ratlos. Irgendeine Idee was hier eigentlich vor sich geht?
Weil Objekte in einem Array zusammenhängend sein müssen. Objekte, die nacheinander auf dem Stapel deklariert werden (im Quellcode, nicht in der Maschine), müssen nicht [zusammenhängend] sein, obwohl sie auch sein können.
Der Standard sagt nichts darüber aus. Dem Compiler steht es frei, zwischen den Elementen den gewünschten Inhalt einzufügen.
(Wenn ich raten müsste, würde ich meinen, dass Ihr Compiler eine Art Stack-Schutz / Kanarienvogel im Debug-Modus implementiert (und dass Sie im Debug-Modus kompilieren))
Der Compiler verwendet nicht nur den Stack, um Ihre lokalen Variablen zu behalten - er verwendet sie auch zum Beispiel für die Übergabe von Argumenten und einen Teil des durch std::cout
verursachten Overheads. Das ist wahrscheinlich, wofür der zusätzliche Abstand zwischen Ihren Variablen verwendet wird.
Wenn Sie stattdessen Ihre Variablen static
wie folgt erstellen:
... die Variablen werden stattdessen im BSS-Speicher abgelegt, und die Ausrichtung wird wahrscheinlicher sein, was Sie erwarten.
Der Grund, warum Arrays gepackt werden, und einzelne Elemente nicht, wird durch andere Antworten geklärt ...
Der Grund ist, dass nicht ausgerichtete Lasten auf den meisten Architekturen langsam sind. Eine gute Erklärung finden Sie im Wikipedia-Eintrag zur Ausrichtung der Datenstruktur . Der Compiler platziert jede Ihrer Datenstrukturen am Anfang eines Datenwortes. In Arrays werden die Elemente jedoch zusammenhängend im Speicher abgelegt (wie es der C ++ - Standard erfordert).