2017-01-23 4 views
0

Ich habe ein Beispiel C++ - Programm auf einem 64-Bit-Linux-Rechner auf VMware Player über Host-Rechner als Windows erstellt. Das Folgende ist ein Klassencode.C++ 64-Bit-Maschine, zeigt 32 Bit-Heap-Adresse

Ich verstehe, dass auf 64-Bit-Maschine Speicheradresse in 8 Bytes dargestellt werden.

Wenn ich das Programm mit GDB ausführen, sehe ich die unten stehende Adresse:

p oOT 
$1 = (operatorOverloadingTest *) 0x613c20 
p &oOT 
$2 = (operatorOverloadingTest **) 0x7fffffffe228 
&(oOT1.age) 
$7 = (int *) 0x7fffffffe210 
(gdb) p &(oOT->age) 
$8 = (int *) 0x613c20 

Meine Frage ist, warum tut Objekt in Heap zugewiesen zeigt eine 32-Bit-Adresse Darstellung und das Objekt auf dem Stapel (oOT1) zeigt eine 64-Bit-Adressdarstellung, obwohl mein Betriebssystem 64 Bit ist? (Überprüft mit uname -a).

+1

weil 0x613c20 = 0x0000000000613c20 - es – Anty

+0

Offenbar führende Nullen abschneidet, der Compiler oder Laufzeit gerade passiert Heap-Speicher in der unteren 4GB lokalisieren des 64-Bit-Adressraums. –

+0

@Anty: Und der Grund, warum es das tut, ist vermutlich, weil es viel einfacher ist zu sehen, dass "0x02000000" nicht "0x20000000" ist, als zu sehen, dass "0x0000000002000000" nicht "0x0000000020000000" ist. –

Antwort

1

Meine Frage ist, warum tut Objekt in Heap zugewiesen eine Darstellung 32-Bit-Adresse zeigt und das Objekt auf dem Stapel (oOT1) zeigt eine 64-Bit-Adresse Darstellung

Wenn Sie bei 0x1234 aussehen, wissen Sie dass die Entität mindestens 16 Bits hat, aber Sie können nicht feststellen, ob es sich um eine 16-Bit-, eine 32-Bit- oder eine 64-Bit-Entität handelt, da GDB führende Nullen nicht druckt.

Wenn Sie wissen wollen, wie groß einige Programmeinheit ist, versuchen:

(gdb) print sizeof(oOT) 
(gdb) print sizeof(&ooT) 
+0

GDB druckt die führenden Nullen nicht. Gibt es einen Befehl, um die Speicherabbildung meiner Binärdatei zu überprüfen, wenn sie in RAM geladen wird. Auf diese Weise konnte ich die Anfangs- und Endadresse des Heapsegments überprüfen und bestätigen, dass sie führende Nullen haben. sizeof() zeigt den vom Objekt benötigten Speicher an, ich wollte die Speicherdarstellung im System kennen, mit dem das Objekt adressiert wurde –

+1

@IndraChatterjee Sie suchen wahrscheinlich nach '(gdb) info proc map' –