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++
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...
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
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ß. ;-)
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?
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
???
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?
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?
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
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.
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.