C Speicher Frage

Gast #4100921
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++
Moderator (Firma: Titel) Persönliche Seite #4100962
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
Gast #4101147
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

???
Persönliche Seite #4101155
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?
Gast #4101164
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?
Gast #4101175
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..Û_«....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren