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
&c - &a ist nur 8. C++ schrieb: > ist es die 64Bit Maschine Welche? Was sagt denn sizeof (int)? Überraschend ist die Adresse von b.
sizeof (int) sagt 4Byte Ich habe das Programm auf einem Pentium i5 laufen Ich lese gerade was über die Memory Management Unit....
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 …
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???
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
:
Bearbeitet durch Moderator
Lothar Miller schrieb: > Wie ist denn im Compiler das Alignment gesetzt? Stimmt das kann es sein, ich schaue gleich mal nach :-)
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? C0. Ist nur ein Schätzwert, kann es leider nicht überprüfen, weil ich nur zehn Finger habe. ;-)
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?
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..Û_«.... |
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
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?
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.
C++ schrieb: > Ausgabe: a=0022FCB8, b=0022FCAC, c=0022FCA0 Rufus meint, warum liegt die Adresse von b nicht zwischen a und c? Tippfehler?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.