Ich führe ein einfaches C++-Programm aus, um etwas über dynamisch zugewiesenen Speicher ( malloc
, realloc
und free
) zu lernen.
Hier ist ein Ausschnitt meines Codes:
void *p = malloc(10); // Allocates 10 bytes in memory; `p` is a pointer to the first byte.
cout << "The value of the pointer p is: " << p << endl;
Die Ausgabe sieht ungefähr so aus:
The value of the pointer p is: 0x7fbf36c00080
Mir ist bewusst, dass die Hexadezimalzahl der Speicherort ist, auf den gezeigt wird p
, und dass es sich dabei um den ersten Speicherort dieser Zuweisung handelt.
Als ich versuchte, ungefähr zu berechnen, wie viel RAM ich habe, schaute ich mir die Anzahl der Ziffern in dieser Hex-Zahl (12 Ziffern) an und potenzierte sie mit 16.
Es stellt sich heraus, dass 16^12 ungefähr 2,8 x 10^14 entspricht, und da jeder Speicherplatz ein Byte speichert, bedeutet das, dass ich ungefähr 280 TERABYTE RAM habe, obwohl ich weiß, dass ich 8 GB habe.
Wo habe ich einen Rechenfehler gemacht?
Antwort1
Sie sollten das Konzept studieren von Virtueller Speicher, um zu verstehen, dass der physische Speicher in den Adressraum des Prozesses abgebildet wird.
Die Tatsache, dass ein 64-Bit-Prozess Zeiger bis 2 64 -1 haben kann, bedeutet nicht, dass dieser gesamte Speicher vorhanden ist. Der Zeiger zeigt auf einen Speichersegment der dem physischen Speicher irgendwo im Computer zugeordnet ist.
Nur das Betriebssystem weiß, wie viel Speicher Sie tatsächlich haben. Daher müssen Sie zum Abrufen dieser Menge dessen API verwenden.
Wie in meinem ersten Wikipedia-Link dargestellt: