2017-08-07 1 views
0

Wie wir wissen, wird Speicher der Struktur zugeordnet, wenn seine Variable definiert ist (oder beim Erstellen einer Instanz).Strukturspeicherzuweisung in C++

Jetzt

struct Programmer { 
int skills; 
int problemSolved; 
}; 

int main(){ 
Programmer me;//Here the memory will be allocated but in what 
       //format(discrete or continuous block of memory)? 
me.skills = 10; 
me.problemSolved = 2000; 
return 0; 
} 

Ist die Speicherinstanz zu strukturieren zugeordnet oder variabel ist in kontinuierlichen Blöcken (wie in Array) oder in diskreten Speicherblock? Wenn ja, warum?

+2

Ja ist es, aber denken Sie daran, es gibt Padding (nicht immer). – DimChtz

+0

Alles, was Sie in einer Struktur garantieren können, ist, dass die Mitglieder in der Reihenfolge zugeordnet werden, in der sie deklariert sind. Der Compiler darf zum Zweck der Ausrichtung "padding" -Bytes einfügen. –

+0

@ ThomasMatthews-- es gibt auch eine Garantie, dass es keine Auffüllung am Anfang einer 'struct' geben wird. –

Antwort

2

Der für einen struct zugewiesene Speicher ist zusammenhängend. Von §6.2.5 ¶20 des Draft Standard C11:

Ein Strukturtyp einen sequentiell zugewiesen nicht leeren Satz von Mitgliedsobjekten beschreibt ....

Aber kann es Polsterung innerhalb der für ein struct zugewiesenen Speicher sein nach §6.7.2.1 ¶15:

kann es unnamed padding innerhalb eines Strukturobjekts sein, aber an seinem Anfang nicht.

Und von 6.7.2.1 ¶17:

unbenannte Polsterung Es kann am Ende einer Struktur oder Vereinigung sein.

+0

Ja und ich kann auch die Auffüllung durch #pragma pack vermeiden, btw Danke :-) –

2

Die Struktur ist auf dem Stapel in einem zusammenhängenden Speicherblock (wahrscheinlich 64 Bit in diesem Fall) zugeordnet. Es wird zugewiesen, wenn die Funktion aufgerufen wird (es sei denn, Ihr Compiler macht etwas kompliziert).

Alle Instanzvariablen sind auf dem Stack zugeordnet (obwohl nicht angegeben ist, wie sie im Standard zugewiesen sind, so tun dies alle Compiler). Wenn Sie eine Funktion rekursiv aufrufen, erhält sie einen neuen Stapelrahmen für weitere Variablen. Wenn Sie also eine Variable "me" auf dem Stapel haben und Sie main() von innerhalb von main() aufrufen, erhalten Sie im zweiten Stapelrahmen eine zweite Variable "me". Wenn das zweite "main()" zurückkehrt, wird der Stapelrahmen für andere zukünftige Aufrufe freigegeben.

+3

Erinnerung: Die Variable muss nicht auf einem Stapel liegen. Es gibt keine Anforderungen für einen Stapel. –

+0

Einverstanden. (a) es ist nicht im Standard angegeben, (b) Compiler-Optimierungen können es entfernen oder anderswo setzen – Jordan