Objektorientierte Programmierung (Java) - Speicherabbilder

2 Antworten

  1. Im Speicher „sieht“ die CPU eigentlich nur wilde und zufällige Folgen von Nullen und Einsen. Diese Bitfolgen werden zu Speicherworten wie Byte, Word, Long usw. zusammengefasst.
  2. Der Programmierer hat nun eine gewisse Vorstellung davon, was eines dieser Speicherworte sein soll: int, long int, float, double, String usw. Seine Aufgabe ist es, ausgehend von diesen Imaginationen das Programm so zu schreiben, dass es mit diesen Daten sinnvoll umgeht.
Wie sieht das Speicherabbild dann aus, wenn ich ein Array von Objekten (bspw. Integer) habe?

Im Speicher sind Folgen von Pointern auf die Ints oder Folgen von Ints abgelegt. Je nachdem, ob du über die Pointer oder direkt auf die Ints zugreifen willst. Im Fall des Pointers brauchst du doppelt soviel Speicher wie beim Direktzugriff. Die Pointer selbst sind ja Adressen, die auf „ihr“ Int zeigen. Beim anderen Fall brauchst du nur einen Pointer auf das erste Int-Objekt und einen passenden Offset auf die weiteren Ints …

Für Rechtecke braucht man üblicherweise einen Pointer auf die Rechteck-Struktur, die aus den Startpunkten für x und y und der Länge bzw. Breite besteht. Soll das Rechteck gedreht werden, braucht man ggf. noch eine Winkelangabe, die den Winkel speichert.

Du solltest hier nicht zu kompliziert denken, sondern deine Gedanken sortieren und klar auf's Papier bringen … :-)


TheXen0  26.01.2015, 10:58

Zufällig sind die Folgen von 1 und 0 wohl nicht!

0
wolfgang1956  26.01.2015, 11:23
@TheXen0

Doch!

  1. ASCII- und UNI-Codes sind willkürlich und daher rein zufällig so wie sie sind.
  2. Die Codierung von Maschinencodes ist ebenfalls willkürlich und daher Zufällen unterworfen …
  3. Die Ergebnisse von Zahlen- oder Texteingaben oder Berechnungen unterliegen ebenfalls Zufällen. Das wir Worte lesen und verstehen können, liegt wieder an den willkürlichen Festlegungen unsererseits, die dann das Verständnis fördern.

Demnach sind diese Abfolgen von Nullen und Einsen wohl doch „zufällig“.

0

Hier mal ein kurzer C++ Code :

    int * ptr = new int[5]; //5 * 4 = 20 Bytes im Heap allocaten

    for (unsigned int i = 0; i < 5; ++i)
    {
        ptr[i] = i;
    }

Zuerst wird ein Pointer zu 20 neu reservierten Bytes im RAM erstellt.

Nach dem for-loop sieht der Array im Heap so aus :

00 00 00 00 | 01 00 00 00 | 02 00 00 00 |  03 00 00 00 | 04 00 00 00

In Java wird das ganze wahrscheinlich anders geregelt (kenne mich bei Java nicht aus).

Aber wenn der int jetzt ein Objekt wäre und nicht nur einfach 4 bytes würde es wahrscheinlich in etwas so aussehen :

AB CD EF 00 | 12 89 CF 00 | ... // ein paar ausgedachte werte

Das sind dann also wiederum weitere Pointer (bzw lediglich Adressen von den int Objekten) zu den Integer Objekten :)