Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Ähnliche Dokumente
Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

6 Speicherorganisation

Speicher und Adressraum

Vorlesung Programmieren

Algorithmen und Datenstrukturen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

pue13 January 28, 2017

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

Java Virtual Machine (JVM) Bytecode

Algorithmen und Programmierung II

Programmieren in Java

2. Unterprogramme und Methoden

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Tag 8 Repetitorium Informatik (Java)

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden Teil 2

Einführung in die Programmierung Blockkurs Java

Algorithmen und Datenstrukturen

Informatik II Übung 05. Benjamin Hepp 3 April 2017

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Algorithmen und Datenstrukturen II

Programmiertechnik Methoden, Teil 2

Schnittstellen, Stack und Queue

Einstieg in die Informatik mit Java

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Einstieg in die Informatik mit Java

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Klassenvariablen, Klassenmethoden

Informatik II Übung 5

Einstieg in die Informatik mit Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Software Engineering Klassendiagramme Einführung

Vorkurs Informatik WiSe 17/18

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Einführung in die Programmierung Blockkurs Java

Implementieren von Klassen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Grundlagen der Programmierung

To know recursion, you must first know recursion. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 17 1

AuD-Tafelübung T-B5b

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

II.3.1 Rekursive Algorithmen - 1 -

Vererbung, Polymorphie

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Programmierung und Angewandte Mathematik

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Martin Unold INFORMATIK. Geoinformatik und Vermessung

14 Abstrakte Klassen, finale Klassen, Interfaces

Informatik II. Woche 13, Giuseppe Accaputo

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Einführung in die Java- Programmierung

Objektorientierte Programmierung

Methoden und Wrapperklassen

Allgemeine Hinweise:

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Grundlagen der Programmierung

Java Kurs für Anfänger Einheit 5 Methoden

EINFÜHRUNG IN DIE PROGRAMMIERUNG

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Programmiertechnik Klassenmethoden

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. Juni 2004

Dynamische Speicherverwaltung

Vorkurs C++ Programmierung

Beuth Hochschule Parameter-Übergabe-Mechanismen WS17/18, S. 1

Martin Unold INFORMATIK. Geoinformatik und Vermessung

6. Funktionen, Parameterübergabe

Agenda. Informatik I WS05/06 Folien von Tobias Dezulian

Klausur Software-Entwicklung März 01

Java Einführung Methoden. Kapitel 6

Einstieg in die Informatik mit Java

Aufgabe 1 (12 Punkte)

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 8. Blatt Für den 16. und

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Selbststudium OOP7 & ALG2 Auftrag

Verkettete Datenstrukturen: Listen

Algorithmen und Datenstrukturen

12 Abstrakte Klassen, finale Klassen und Interfaces

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Arten von Klassen-Beziehungen

Grundlagen der OO- Programmierung in C#

Grundlagen der Programmierung WS 15/16 (Vorlesung von Prof. Bothe)

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden

Institut fu r Informatik

Betriebssysteme. Wintersemester Kapitel 3 Speicherverwaltung. Patrick Kendzo

Einführung in das Programmieren Probeklausur Lösungen

Objektorientierte Programmierung (ZQ1u2B)

Repetitorium Informatik (Java)

Transkript:

Heap vs. vs. statisch Der Speicher des Programms ist in verschiedene Speicherbereiche untergliedert Speicherbereiche, die den eigentlichen Programmcode und den Code der Laufzeitbibliothek enthalten; einen Speicherbereich für globale/statische Variablen; einen Speicherbereich Heap, und einen Speicherbereich. Adressraum. Heap Globale Variablen Bibliotheksfunktionen Program Heap Auf dem Heap können zur Laufzeit zusammenhängende Speicherbereiche angefordert werden, und in beliebiger Reihenfolge wieder freigegeben werden. Der ist ein Speicherbereich, auf dem neue Elemente oben gespeichert werden, und Freigaben in umgekehrter Reihenfolge (d.h. oben zuerst) erfolgen müssen (LIFO = Last In First Out). Statische Variablen Statische Variablen werden zu Beginn des Programms angelegt, und zum Ende des Programms wieder gelöscht. Variablen werden üblicherweise auf dem Heap oder dem gespeichert.. In Java müssen Elemente auf dem Heap nicht explizit wieder freigegeben werden. Diese Freigabe übernimmt der Garbage Collector. Harald Räcke 143 Statische Variablen Beispiel Statische Variablen Statische Variablen (auch Klassenvariablen) werden im Klassenrumpf ausserhalb einer Funktion definiert. Jede Funktion der Klasse kann dann diese Variablen benutzen; deshalb werden sie manchmal auch globale Variablen genannt. 1 public class GGT extends MiniJava { 2 static int x, y; 3 static void readinput() { 4 x = read(); 5 y = read(); 6 7 public static void main (String[] args) { 8 readinput(); 9 while (x!= y) { 10 if (x < y) 11 y = y - x; 12 else 13 x = x - y; 14 15 write(x); 16 17 Harald Räcke 144 Harald Räcke 145

Verwendung des Heaps Speicherallokation mit dem Operator new: i n t [ ] [ ] arr ; arr = new i n t [ 1 0 ] [ ] ; // array mit int - Verweisen Immer wenn etwas mit new angelegt wird, landet es auf dem Heap. Wenn keine Referenz mehr auf den angeforderten Speicher existiert kann der Garbage Collector den Speicher freigeben: i n t [ ] [ ] arr ; arr = new i n t [ 1 0 ] [ ] ; // array mit int - Verweisen arr = null ; // j e t z t koennte GC freigeben Verwendung des Heaps Beispiel: 1 public static int[] readarray(int number) { 2 // number = Anzahl zu lesender Elemente 3 int[] result = new int[number]; 4 for (int i = 0; i < number; ++i) { 5 result[i] = read(); 6 7 return result; 8 9 public static void main(string[] args) { 10 readarray(6); 11 Da die von readarray zurückgegebene Referenz nicht benutzt wird, kann der GC freigeben. Harald Räcke 146 Harald Räcke 147 Verwendung des Heaps Verwendung des s Beispiel: 1 public static void main(string[] args) { 2 int[] b = readarray(6); 3 int[] c = b; 4 b = null; 5 Da c immer noch eine Referenz auf das array enthält erfolgt keine Freigabe. Bei Aufruf einer Funktion (auch main()) werden lokale Variablen (d.h. auch Werte von aktuellen Parametern) und die Rücksprungadresse als Frames auf dem gespeichert. Während der Programmausführung sind nur die Variablen im obersten Frame zugreifbar. Bei der Beendigung einer Funktion wird der zugehörige frame gelöscht. Harald Räcke 148 Harald Räcke 149

Parameterübergabe Call-by-Value public s t a t i c void setvar ( i n t z ) { z = 1; public s t a t i c void main ( String [ ] args ) z{ 0 kopiere den Wert i n t x ; von x in die lokale x = 0; Animation ist nur in der main() Variable z setvar ( x ) ; Vorlesungsversion der Folien x 0 args 2B80 vorhanden. write ( "x == " + x ) ; main() x args 2B80 z ret 1 0FDA Das ist die einzige Form der Parameterübergabe, die Java unterstützt. Die Variable, die wir bei dem Aufruf übergeben, verändert ihren Wert nicht. Parameterübergabe Call-by-Reference public s t a t i c void setvar ( i n t &z ) { z = 1; &z 0DA7 kopiere die Adresse public s t a t i c void main ( String [ ] args main() ) { von x in die lokale i n t x ; Referenzvariable z Animation ist nur in der x 1 args 2B80 x = 0; Vorlesungsversion der Folien main() setvar ( x ) ; vorhanden. x 0 args 2B80 write ( "x == " + x ) ; &z main() x 0DA7 args 2B80 Diese Form der Parameterübergabe ist in Java nicht möglich, aber z.b. in C++. Harald Räcke 150 Harald Räcke 151 Parameterübergabe Referenzvariablen Auch Referenzvariablen werden per call-by-value übergeben. Man kann den Inhalt des zugehörigen Objekts/Arrays aber verändern. public s t a t i c void setvar ( i n t [ ] a ) { a [ 1 ] = 1; arr a Parameterübergabe Referenzvariablen Wenn man das Objekt selber verändert, ist die Änderung nicht nach aussen sichtbar. public s t a t i c void setvar ( i n t [ ] a ) { a = new i n t [ 3 ] ; a [ 1 ] = 1; arr a public s t a t i c void main ( String [ ] args ) { // i n i t i a l i z e array elements to 0 i n t [ ] arr = new i n t [ 3 ] ; setvar ( arr ) ; write ( " arr [ 1 ] == " + arr [ 1 ] ) ; 0 10 0 public s t a t i c void main ( String [ ] args ) { // i n i t i a l i z e array elements to 0 i n t [ ] arr = new i n t [ 3 ] ; setvar ( arr ) ; write ( " arr [ 1 ] == " + arr [ 1 ] ) ; 0 0 0 0 10 0 Ausgabe: arr[1] == 1 Ausgabe: arr[1] == 0

Rekursive Funktionen ret 17B2 tmp 2 n 3 ret 17B2 tmp n 3 Rekursive Funktionen sind Funktionen, die sich selber aufrufen (eventuell über Umwege). ret 17B2 tmp 24 n 4 Beispiel: Fakultätsberechnung { ret 17B2 tmp 6 n 4 1 n = 0 n! = n (n 1)! sonst ret 17B2 tmp n 4 Animation ist nur in der public s t a t i c long fak ( i n t n ) { Vorlesungsversion der Folien long tmp; tmp 120 n 5 vorhanden. i f ( n > 0) { tmp 24 n 5 tmp = fak ( n- 1 ) ; tmp *= n ; tmp n 5 return tmp; else return 1; 1 public class Fakultaet { 2 public static long fak(int n) { 3 if (n > 0) 4 return n*fak(n-1); 5 else 6 return 1; 7 8 public static void main(string args[]) { 9 System.out.println(fak(20)); 10 11 Harald Räcke 155 Fibonaccizahlen { n 0 n 1 F n = F n 1 + F n 2 n 2 13 21 2 3 1 1 5 8 1 public class Fibonacci { 2 public static long fib(int n) { 3 if (n > 1) 4 return fib(n-1)+fib(n-2); 5 else 6 return n; 7 8 9 public static void main(string args[]) { 10 System.out.println(fib(50)); 11 12 Harald Räcke 157

Fibonaccizahlen Fibonaccizahlen Programmlauf benötigt mehr als 1min. Warum ist das so langsam? Fn Lösung Speichere die Lösung für ein Teilproblem in einer globalen Fn 1 Fn 2 Variable. Fn 2 Wenn das Teilproblem das nächste mal gelöst werden soll braucht man nur nachzuschauen... Fn 8 Wir erzeugen viele rekursive Aufrufe für die gleichen Teilprobleme! Harald Räcke 159 1 public class FibonacciImproved { 2 // F 93 does not fit into a long 3 static long[] lookup = new long[93]; 4 5 public static long fib(int n) { 6 if (lookup[n] > 0) return lookup[n]; 7 8 if (n > 1) { 9 lookup[n] = fib(n-1)+fib(n-2); 10 return lookup[n]; 11 else 12 return n; 13 14 public static void main(string args[]) { 15 System.out.println(fib(50)); 16 17