Anzahl bytes auf dem Stack?

Hallo,
ich fahre FreeBSD:
Code:
FreeBSD laptop 6.2-RELEASE-p2 FreeBSD 6.2-RELEASE-p2 #0: Tue Feb 27 22:41:06 UTC 2007     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386

und ich kapiere nicht so ganz, wie hier die Bytes auf dem Stack angeordnet werden, wenn ich eine Funktion aufrufe, und diese lokale daten enthaelt.
Ich habe also eine main funktion (in C), die ruft eine eigene Funktion auf. dort habe ich einmal ein int-Array mit 5 Elementen deklariert. Da wurden dann 40 Bytes auf dem Stack für das Array (oder noch mehr?) platz gemacht.
Für ein char-array mit 10 Elementen wurden hingegen 24 Bytes auf dem Stack reserviert.

Wenn ich jetzt beide Arrays auf den Stack legen lasse in der Funktion, werden 56 (!) Bytes reserviert.

Ich weiss zwar, dass die Daten wortweise (also 4 Byte-mässig) angelegt werden, aber trotzdem ist mir das nicht wirklich klar.
Warum bei dem int-array denn 40 Byte? nach sizeof() belegt ein int auf der Architektur 2 Byte. Aber für 40 Byte müsste ja für jeden Eintrag *1* ganzes Wort angelegt werden. Stimmt das? Aber warum sind es dann beim 10-er charArray dann gerade *24*? und nicht 80(fuer jeden arrayeintrag) oder 12 (oder logischer auf vielfaches von 4 aufgerundet)?

Und die Kombination der beiden auf 56 kapiere ich erst recht nicht. wenn man beide addiert von den grössen, ist 64 um einiges grösser, okay, da kann man sparen, aber wie wird das dann angelegt?

Kann mir da einer helfen? Ich kapiere das gar nicht.
Stackprotection ist meines Wissens nicht an, und es sieht imo auch nicht danach aus.
Hilfe wäre echt nett.
 
Ich glaub du verwechselst da was. Der Stack (auf deutsch Stapel) ist ein Speicher, den du dir wie ein Bücherstapel vorstellen kannst. Mit dem Assemblerbefehl push kannst du da was ablegen und mit pop bekommst du die zuletzt abgelegten Daten wieder zurück.
 
Hi, kann es sein, dass du den Heap meinst? Oder Argumente einer Funktion und nicht lokale Variablen?

Mit dem Stack passiert da folgendes:
Code:
...
push  %ebp
mov   %esp,%ebp
push  %ecx

call  <test>
 
CDW: Ja, es geht um gcc

Code:
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305
Sry, hab ich vergessen. Und ein Freund hat mir noch den Link geschickt:
http://gcc.gnu.org/ml/gcc-bugs/2003-06/msg02005.html
Was auch lustig ist, wenn man fuenf einzelne chars auf den stack legt, werden ordnungsgemäss 2 Wörter verwendet, bei einem char-Feld mit 5 Einträgen wird der ESP zeiger um 24 Bytes vermindert.


thyrael und mucki: Ich weiß durchaus, von was ich rede :)
 
einem char-Feld mit 5 Einträgen wird der ESP zeiger um 24 Bytes vermindert.
also aus optimiertechnischer Sicht würde es durchaus Sinn machen, auch im Chararray DWORDs zu verwenden. Kann Dir da allerdings nicht wirklich weiterhelfen -
vermute jedoch, dass es Sinn machen würde, wenn Du noch die Compilerflags mitposten würdes ;). Eventuell mal auch mit unterschiedlichen Optimierungsstufen ausprobieren.
 
Zurück
Oben