Forum: PC-Programmierung C Speicher Frage


von C++ (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade zu verstehen warum der Speicher
nicht nacheinander sondern immer mit 8Byte dazwischen
ausgefüllt wird:

Hier das einfache Programm:

#include <stdio.h>
void main(void)
{
 int a = 0, b = 1, c = 2;
 printf("a=%p, b=%p, c=%p", &a, &b, &c);
}

Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0

A0 bis AC = 4Byte durch int dann 8Byte frei

AC bis 94 = 4Byte durch int dann 8Byte frei

Warum ist das so? ist der Zugriff so effektiver?
Legt der Linker das fest? oder ist es die 64Bit Maschine?

Gruß C++

: Verschoben durch Moderator
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

&c - &a ist nur 8.

C++ schrieb:
> ist es die 64Bit Maschine

Welche?

Was sagt denn sizeof (int)?

Überraschend ist die Adresse von b.

von C++ (Gast)


Lesenswert?

sizeof (int) sagt 4Byte
Ich habe das Programm auf einem Pentium i5 laufen
Ich lese gerade was über die Memory Management Unit....

von Malte (Gast)


Lesenswert?

Um was für nen Compiler und was für ein System gehts denn? Auf meinem 
64-bit-Linux mit gcc 4.8.2 liegen die drei ints nämlich direkt 
hintereinander …

von C++ (Gast)


Lesenswert?

OK Windows 7 64bit :-) mit Visual Studio und Microsoft Visual C++ 
Compiler 12.0 (x86) MSVC.... Stimmt bei mir legt der gcc das auch 
hintereinander???

von NT (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> &c - &a ist nur 8.

Wieso das?

Sind doch je 12 Byte Abstand bei ihm.

Bei mir genau hintereinander:

a=0012ff4c, b=0012ff48, c=0012ff44Press any key to continue...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

C++ schrieb:
> OK Windows 7 64bit :-) mit Visual Studio und Microsoft Visual C++
> Compiler 12.0 (x86) MSVC....
Hat also eigentlich nicht viel mit "Mikrocontrollern" oder gar 
"Elektronik" zu tun, sondern eher mit "PC-Programmierung"...

Wie ist denn im Compiler das Alignment gesetzt?

NT schrieb:
> Bei mir genau hintereinander:
Beim Codepad auch: http://codepad.org/VVLJxScE
Output:  a=0xffb8e4dc, b=0xffb8e4d8, c=0xffb8e4d4

: Bearbeitet durch Moderator
von C++ (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie ist denn im Compiler das Alignment gesetzt?

Stimmt das kann es sein, ich schaue gleich mal nach :-)

von Konrad S. (maybee)


Lesenswert?

Ist das ein Debug-Build?

von C++ (Gast)


Lesenswert?

Es war die Speicherausrichtung, Danke an Lothar Miller

von C++ (Gast)


Lesenswert?

Konrad S. schrieb:
> Ist das ein Debug-Build?

Ja ???

von C++ (Gast)


Lesenswert?

Stimmt bei umstellen auf Release macht er es auch hintereinander :-)

von Konrad S. (maybee)


Lesenswert?

Altbekanntes Problem: Im Release-Build tritt ein Fehler auf, der sich im 
Debug-Build nicht reproduzieren lässt. Da macht die Fehlersuche gleich 
doppelt so viel Spaß. ;-)

von C++ (Gast)


Lesenswert?

Vielen Dank Konrad S. :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

NT schrieb:
>> &c - &a ist nur 8.
>
> Wieso das?

C++ schrieb:
> printf("a=%p, b=%p, c=%p", &a, &b, &c);
> }
>
> Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0

&a ist ..B8
&c ist ..A0

Was ist B8 + 8?

von Konrad S. (maybee)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was ist B8 + 8?

C0. Ist nur ein Schätzwert, kann es leider nicht überprüfen, weil ich 
nur zehn Finger habe. ;-)

von NT (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was ist B8 + 8?

Weiß nicht was du hier für ein Problem hast.

Die Adressen liegen von rechts (c=2) nach links (a=0) beim VC 
aufsteigend im Speicher:

<c>
0x0020F864  02 00 00 00 cc cc cc cc cc cc cc cc 01 00 00 00
            |                                   |
                12 Bytes Abstand oder Ch Bytes
</c>

(im Debug Modus beim VC ; Pelles C erspart sich die Füllbytes)

Oder meinetwegen als 32-bit betrachtet, liegen halt 8 Füllbyte 
dazwischen (oder 2 32-bit int).

> Überraschend ist die Adresse von b.

Was war daran nun überraschend anders als an Adresse von a oder von c

???

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

NT schrieb:
> Weiß nicht was du hier für ein Problem hast.

Ich bin mir nicht sicher, wer hier das Problem hat.

Ich habe mir die Adressen angesehen, die "C++" in seinem Beitrag 
angegeben hat:
1
#include <stdio.h>
2
void main(void)
3
{
4
int a = 0, b = 1, c = 2;
5
printf("a=%p, b=%p, c=%p", &a, &b, &c);
6
}
7
8
Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0

Nochmal zum Mitmeisseln:

&a = 22FCB8
&b = 22FCAC
&c = 22FCA0

Das passt nicht zu Deinem

NT schrieb:
> Die Adressen liegen von rechts (c=2) nach links (a=0) beim VC
> aufsteigend im Speicher:


Verwendest Du einen Font, bei dem Du die Glyphen B und 8 nicht 
auseinanderhalten kannst?

von NT (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Nochmal zum Mitmeisseln:
>
> &a = 22FCB8
> &b = 22FCAC
> &c = 22FCA0
>
> Das passt nicht zu Deinem
>
> NT schrieb:
>> Die Adressen liegen von rechts (c=2) nach links (a=0) beim VC
>> aufsteigend im Speicher:
>
> Verwendest Du einen Font, bei dem Du die Glyphen B und 8 nicht
> auseinanderhalten kannst?

Bist du blind? Natürlich passt das. Rechne doch mal richtig!

Von rechts nach links

Rechts steht &c ; links steht &a

AC - A0 ist was bei dir? Bei mir = C
B8 - AC ist was bei dir? Bei mir = C

Was ist C hex? 12 Dezimal. Also 12 Bytes Abstand!!!

Genau so ist's im Speicher abgeordnet.

Willst du einen Screenshot?

von NT (Gast)


Lesenswert?

Zähl mal Bytes ab von der 2 bis zur 1 bis zur 0
1
-    &a  0x0020f87c  int *
2
      0  int
3
-    &b  0x0020f870  int *
4
      1  int
5
-    &c  0x0020f864  int *
6
      2  int
7
8
0x0020F864  00000002 cccccccc cccccccc 00000001 cccccccc  ....ÌÌÌÌÌÌÌÌ....ÌÌÌÌ
9
0x0020F878  cccccccc 00000000 cccccccc 0020f8d4 003619f8  ÌÌÌÌ....ÌÌÌÌÔø .ø.6.
10
0x0020F88C  00000001 00521b90 00522200 ab5fdb2e 00000000  ......R.."R..Û_«....

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

NT schrieb:
> Bist du blind? Natürlich passt das. Rechne doch mal richtig!

Sieh DU Dir doch mal die verdammten Adressen an, die "C++" gepostet 
hat, bevor Du hier Leuten Blindheit unterstellst!


> Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0

Also, nach Adressen sortiert
1
a=0022FCB8 
2
  - 8 Bytes -
3
c=0022FCA0
4
  - 12 Bytes - 
5
b=0022FCAC

: Bearbeitet durch User
von Konrad S. (maybee)


Lesenswert?

Rufus Τ. Firefly schrieb:
> a=0022FCB8

a gleich null null zwo zwo eff tse be acht

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
>
> Also, nach Adressen sortiert
>
>
1
> a=0022FCB8
2
>   - 8 Bytes -
3
> c=0022FCA0
4
>   - 12 Bytes -
5
> b=0022FCAC
6
>
1
a=0022fcb8
2
b=0022fcac
3
c=0022fca0
von oben nach unten sortiert. B8 ist jawohl höher als AC, oder?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

oh.

my.

fucking.

goodness.



Gratuliere, Jungs, ihr habt gerad mitbekommen, wie ich mich erfolgreich 
zum Horstlöffel gemacht habe.

Weia. Das ist mir jetzt tatsächlich sogar etwas peinlich.

Rahmt Euch diesen Thread.

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

schon gut, kann jedem mal passieren.

Rufus Τ. Firefly schrieb:
> Horstlöffel
tolles Wort :-)

von Martin (Gast)


Lesenswert?

C++ schrieb:
> Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0

Rufus meint, warum liegt die Adresse von b nicht zwischen a und c? 
Tippfehler?

von Konrad S. (maybee)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Rahmt Euch diesen Thread.

Eh klar! ;-)

Ist wie mit 'nem Bild mit Mondkratern. Wenn du beim ersten Blick Hügel 
statt Krater siehst, dann war's das. Selbst das Wissen, dass es Krater 
sind, hilft dann nicht unbedingt weiter.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.