Fachvortrag Crashkurs C Mit Hilfe von Java IPhone

  • Slides: 93
Download presentation

Fachvortrag Crashkurs C++ Mit Hilfe von Java IPhone Alexis Popovski Serdar Korkmaz Canan Ucan

Fachvortrag Crashkurs C++ Mit Hilfe von Java IPhone Alexis Popovski Serdar Korkmaz Canan Ucan Tuan Nguyen Dominic Engel

Fachvortrag Crashkurs C++ Mit Hilfe von Java IPhone Alexis Popovski Serdar Korkmaz Canan Ucan

Fachvortrag Crashkurs C++ Mit Hilfe von Java IPhone Alexis Popovski Serdar Korkmaz Canan Ucan Tuan Nguyen Dominic Engel

Gliederung Vergleich Installation Konstruktoren/ Einführung Zeiger Speicher und und Fazit Grundaufbau Destruktoren Referenzen

Gliederung Vergleich Installation Konstruktoren/ Einführung Zeiger Speicher und und Fazit Grundaufbau Destruktoren Referenzen

Gliederung Vergleich und Fazit

Gliederung Vergleich und Fazit

Einführung

Einführung

Entstehung Bjarne Stroustrup C als prozedurale Sprache Klassen von SIMULA Erscheinungsjahr: 1985

Entstehung Bjarne Stroustrup C als prozedurale Sprache Klassen von SIMULA Erscheinungsjahr: 1985

Entstehung Bjarne Stroustrup C als prozedurale Sprache Klassen von SIMULA Erscheinungsjahr: 1985

Entstehung Bjarne Stroustrup C als prozedurale Sprache Klassen von SIMULA Erscheinungsjahr: 1985

Entstehung Multiparadigmensprache Generisch Prozedural Objektorientiert

Entstehung Multiparadigmensprache Generisch Prozedural Objektorientiert

Multiparadigmensprache Generisch Prozedural Objektorientiert

Multiparadigmensprache Generisch Prozedural Objektorientiert

Multiparadigmensprache Prozedurale Programmierung (POP) Programme bestehen aus einer (endlichen) Folge von Anweisungen Zur Strukturierung

Multiparadigmensprache Prozedurale Programmierung (POP) Programme bestehen aus einer (endlichen) Folge von Anweisungen Zur Strukturierung werden inhaltlich zusammenhängende (Teil-)Folgen von Anweisungen in Prozeduren zusammengefasst Prozeduren: Folge imperativer Anweisungen: Zuweisungen, Tests, Schleifen, Aufrufe Unterprozeduren Prozeduren sind Funktionen, die Argumente entgegennehmen & abhängige Rückgabewerte liefern typische POP-Sprachen: Fortran, C, COBOL, Pascal

Prozedurale Programmierung (POP) Programme bestehen aus einer (endlichen) Folge von Anweisungen Zur Strukturierung werden

Prozedurale Programmierung (POP) Programme bestehen aus einer (endlichen) Folge von Anweisungen Zur Strukturierung werden inhaltlich zusammenhängende (Teil-)Folgen von Anweisungen in Prozeduren zusammengefasst Prozeduren: Folge imperativer Anweisungen: Zuweisungen, Tests, Schleifen, Aufrufe Unterprozeduren Prozeduren sind Funktionen, die Argumente entgegennehmen & abhängige Rückgabewerte liefern typische POP-Sprachen: Fortran, C, COBOL, Pascal

Prozedurale Programmierung (POP) vs. Objektorientierte Programmierung (OOP) Objektorientierte Programmierung soll Schwierigkeiten, die bei der

Prozedurale Programmierung (POP) vs. Objektorientierte Programmierung (OOP) Objektorientierte Programmierung soll Schwierigkeiten, die bei der prozeduralen Programmierung entstehen können, reduzieren Hauptmodule: Klassen und nicht Prozeduren Erstellung von Klassen und Objekten Modellierung von realen Objekten

Prozedurale Programmierung (POP) vs. Objektorientierte Programmierung (OOP) Objektorientierte Programmierung soll Schwierigkeiten, die bei der

Prozedurale Programmierung (POP) vs. Objektorientierte Programmierung (OOP) Objektorientierte Programmierung soll Schwierigkeiten, die bei der prozeduralen Programmierung entstehen können, reduzieren Hauptmodule: Klassen und nicht Prozeduren Erstellung von Klassen und Objekten Modellierung von realen Objekten

Objektorientierte Programmierung Prozedurale Programmierung (POP)(OOP) vs. Objektorientierte Programmierung (OOP) Kapselung Objekt kapselt seine Attribute

Objektorientierte Programmierung Prozedurale Programmierung (POP)(OOP) vs. Objektorientierte Programmierung (OOP) Kapselung Objekt kapselt seine Attribute und Methoden Vererbung Eine abgeleitete Klasse erbt alle Eigenschaften ihrer Basisklasse Polymorphie Objekte einer Instanz verändern zu Laufzeit ihr Verhalten

Objektorientierte Programmierung (OOP) Kapselung Objekt kapselt seine Attribute und Methoden Vererbung Eine abgeleitete Klasse

Objektorientierte Programmierung (OOP) Kapselung Objekt kapselt seine Attribute und Methoden Vererbung Eine abgeleitete Klasse erbt alle Eigenschaften ihrer Basisklasse Polymorphie Objekte einer Instanz verändern zu Laufzeit ihr Verhalten

Generische Programmierung Objektorientierte Programmierung (OOP) Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken Funktionen werden für unterschiedliche

Generische Programmierung Objektorientierte Programmierung (OOP) Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken Funktionen werden für unterschiedliche Datentypen möglichst allgemein entworfen Implementierung erfolgt durch das Konzept generischer Typen bzw. Templates Für Template unerheblich, ob es Zahlen oder Männer vertauschen soll (Zeile 11 & 12) Selbst Typ-Parameter T (Zeile 1) muss nicht spezifiziert werden Compiler kann diesen aus Funktionsargumenten (Zeile 11 & 12) ableiten

Generische Programmierung Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken Funktionen werden für unterschiedliche Datentypen möglichst allgemein

Generische Programmierung Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken Funktionen werden für unterschiedliche Datentypen möglichst allgemein entworfen Implementierung erfolgt durch das Konzept generischer Typen bzw. Templates Für Template unerheblich, ob es Zahlen oder Männer vertauschen soll (Zeile 11 & 12) Selbst Typ-Parameter T (Zeile 1) muss nicht spezifiziert werden Compiler kann diesen aus Funktionsargumenten (Zeile 11 & 12) ableiten

Wann wird C++ verwendet? Wann eignet sich Java mehr? Generische Programmierung Geeigneter für Software

Wann wird C++ verwendet? Wann eignet sich Java mehr? Generische Programmierung Geeigneter für Software zur Manipulation auf Hardware-Ebene „sichere Sprache“ Maschinennähe: Schneller Zugriff auf RAM, Festplatte, CPU usw. Anwendungsprogramme -> Beliebt bei gewerblicher Softwareerstellung Eigene Schnittstelle für grafische Benutzeroberfläche Systemprogramme Grundlage für Android-Entwicklung Frage der Effizienz für hohe Effizienz nimmt C++-Programmierung erhebliche Umstände in Kauf Sofern Optimierung zweitrangig -> Java

Wann wird C++ verwendet? Wann eignet sich Java mehr? Geeigneter für Software zur Manipulation

Wann wird C++ verwendet? Wann eignet sich Java mehr? Geeigneter für Software zur Manipulation auf Hardware-Ebene „sichere Sprache“ Maschinennähe: Schneller Zugriff auf RAM, Festplatte, CPU usw. Anwendungsprogramme -> Beliebt bei gewerblicher Softwareerstellung Eigene Schnittstelle für grafische Benutzeroberfläche Systemprogramme Grundlage für Android-Entwicklung Frage der Effizienz für hohe Effizienz nimmt C++-Programmierung erhebliche Umstände in Kauf Sofern Optimierung zweitrangig -> Java

Installation und Grundaufbau

Installation und Grundaufbau

Compiler - Auswahl Nicht nur ein Compiler wie bei Java Clang GCC MSVC (MS

Compiler - Auswahl Nicht nur ein Compiler wie bei Java Clang GCC MSVC (MS Visual C++)

Compiler - Auswahl Nicht nur ein Compiler wie bei Java Clang GCC MSVC (MS

Compiler - Auswahl Nicht nur ein Compiler wie bei Java Clang GCC MSVC (MS Visual C++)

Compiler - Auswahl Editor - Auswahl CLion Visual Studio XCode Visual Studio Code

Compiler - Auswahl Editor - Auswahl CLion Visual Studio XCode Visual Studio Code

Editor - Auswahl CLion Visual Studio XCode Visual Studio Code

Editor - Auswahl CLion Visual Studio XCode Visual Studio Code

Editor - Auswahl Aufteilung in. h und. cpp – Datein Deklaration Implementierung

Editor - Auswahl Aufteilung in. h und. cpp – Datein Deklaration Implementierung

Aufteilung in. h und. cpp – Datein Deklaration Implementierung

Aufteilung in. h und. cpp – Datein Deklaration Implementierung

Aufteilung Live Demo in. h und. cpp – Datein Beispiele im Anhang

Aufteilung Live Demo in. h und. cpp – Datein Beispiele im Anhang

Live Demo

Live Demo

Zeiger und Referenzen

Zeiger und Referenzen

Zeiger und Referenzen

Zeiger und Referenzen

Zeiger und Referenzen Sind ungefähr das Gleiche, aber wiederum auch nicht Sehr effizient zusammen,

Zeiger und Referenzen Sind ungefähr das Gleiche, aber wiederum auch nicht Sehr effizient zusammen, funktionieren jeweils aber auch alleine Abstrakt gesagt, sind Zeiger und Referenzen wie Bruder und Schwester Zeiger werden mit einem Asterisk (*) gekennzeichnet Referenzen werden mit einem Empersand (&) gekennzeichnet

Zeiger und Referenzen string a = "hi"; 0 x 00 AZWE 3… void do.

Zeiger und Referenzen string a = "hi"; 0 x 00 AZWE 3… void do. Something(){} 0 x 014 FVC… double a = 5. 5; Load Disc 0 x 12 ADG 56… 0 x 014 FVC… int a = 5; Instructions 0 x 00 AZWE 3… 0 x 00 BFC…

Zeiger und Referenzen string a = "hi"; 0 x 00 AZWE 3… void do.

Zeiger und Referenzen string a = "hi"; 0 x 00 AZWE 3… void do. Something(){} 0 x 014 FVC… double a = 5. 5; Load Disc 0 x 12 ADG 56… 0 x 014 FVC… int a = 5; Instructions 0 x 00 AZWE 3… 0 x 00 BFC…

Zeiger und Referenzen Straße repräsentiert einen Speicherblock, mit einem Start und einem Ende Ein

Zeiger und Referenzen Straße repräsentiert einen Speicherblock, mit einem Start und einem Ende Ein Computer braucht, für alles was wir an einem Computer tun, Speicher Denn alles, was wir an einem Computer tun, wird in den Speicher geschoben und dort ausgeführt Alles, was in den Speicher geschoben wird, bekommt eine Adresse, auf die wir mit dem Zeiger zugreifen können(um Speicher zu managen und zu manipulieren)

Was ist ein Zeiger? Ganz einfach: Ein Zeiger ist einfach ein Integer, der eine

Was ist ein Zeiger? Ganz einfach: Ein Zeiger ist einfach ein Integer, der eine Speicheradresse enthält Mehr nicht!

Was ist sind ein Referenzen? Zeiger? Eine Art „Erweiterung“ für Zeiger Ein Verweis auf

Was ist sind ein Referenzen? Zeiger? Eine Art „Erweiterung“ für Zeiger Ein Verweis auf eine bereits existierende Variable Belegen keinen neuen Speicher Referenzen referenzieren auf ein bereits existierendes Objekt …und können nicht nur deklariert werden, sondern müssen sofort initialisiert werden

Was Demo sind Referenzen? Live Beispiele im Anhang

Was Demo sind Referenzen? Live Beispiele im Anhang

Live Demo

Live Demo

Konstruktoren/ Destruktoren

Konstruktoren/ Destruktoren

Konstruktor & Destruktor class Foo { public: Foo(); ~Foo(); }; // Konstruktor (ctor) //

Konstruktor & Destruktor class Foo { public: Foo(); ~Foo(); }; // Konstruktor (ctor) // Destruktor (dtor) Aufgaben des Konstruktors Objekt in validen initialen Zustand überführen Benötigte Ressourcen akquirieren Aufgabe des Destruktors Ressourcen ggf. wieder freigeben

Konstruktor & Destruktor class Foo { public: Foo(); ~Foo(); }; // Konstruktor (ctor) //

Konstruktor & Destruktor class Foo { public: Foo(); ~Foo(); }; // Konstruktor (ctor) // Destruktor (dtor) Aufgaben des Konstruktors Objekt in validen initialen Zustand überführen Benötigte Ressourcen akquirieren Aufgabe des Destruktors Ressourcen ggf. wieder freigeben

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Scope und Lebenszeit von Objekten

Konstruktor & Destruktor Das RAII-Prinzip RAII — Resource Acquisition Is Initialization Resource Ownership: Objekt

Konstruktor & Destruktor Das RAII-Prinzip RAII — Resource Acquisition Is Initialization Resource Ownership: Objekt besitzt Ressource Konstruktor holt / alloziert Ressource Destruktor gibt Ressource wieder frei Essentiell für Exception Safety Typische Ressourcen: Speicher, Datei, Thread, Hardware, Grafikpuffer- oder Texturobjekt etc.

Konstruktor & Destruktor Das RAII-Prinzip RAII — Resource Acquisition Is Initialization Resource Ownership: Objekt

Konstruktor & Destruktor Das RAII-Prinzip RAII — Resource Acquisition Is Initialization Resource Ownership: Objekt besitzt Ressource Konstruktor holt / alloziert Ressource Destruktor gibt Ressource wieder frei Essentiell für Exception Safety Typische Ressourcen: Speicher, Datei, Thread, Hardware, Grafikpuffer- oder Texturobjekt etc.

Konstruktor & Destruktor Das RAII-Prinzip: Einfaches Beispiel mit Speicher als Ressource

Konstruktor & Destruktor Das RAII-Prinzip: Einfaches Beispiel mit Speicher als Ressource

Konstruktor & Destruktor Das RAII-Prinzip: Einfaches Beispiel mit Speicher als Ressource

Konstruktor & Destruktor Das RAII-Prinzip: Einfaches Beispiel mit Speicher als Ressource

Speicher

Speicher

Speicher

Speicher

Speicher aus Sicht von Java (dieser Platz wurde absichtlich freigelassen)

Speicher aus Sicht von Java (dieser Platz wurde absichtlich freigelassen)

Speicher aus Sicht von Java (dieser Platz wurde absichtlich freigelassen)

Speicher aus Sicht von Java (dieser Platz wurde absichtlich freigelassen)

Speicher aus Sicht von C++ Java Heap Dynamische Speicherverwaltung Stack Funktionsaufrufe, lokale Variablen Statischer

Speicher aus Sicht von C++ Java Heap Dynamische Speicherverwaltung Stack Funktionsaufrufe, lokale Variablen Statischer Speicher Programmspeicher Globale Variablen Das eigentliche Programm (z. B. Anweisungen)

Speicher aus Sicht von C++ Heap Dynamische Speicherverwaltung Stack Funktionsaufrufe, lokale Variablen Statischer Speicher

Speicher aus Sicht von C++ Heap Dynamische Speicherverwaltung Stack Funktionsaufrufe, lokale Variablen Statischer Speicher Programmspeicher Globale Variablen Das eigentliche Programm (z. B. Anweisungen)

Stack Speicher aus Sicht von C++ Für Speicher auf dem Stack muss man nichts

Stack Speicher aus Sicht von C++ Für Speicher auf dem Stack muss man nichts explizit anfordern oder freigeben Automatisch LIFO- Datenstruktur: „Last In First Out“ effizient Festgelegte Größe, kann in einer IDE oder direkt am Betriebssystem verändert werden

Stack Für Speicher auf dem Stack muss man nichts explizit anfordern oder freigeben Automatisch

Stack Für Speicher auf dem Stack muss man nichts explizit anfordern oder freigeben Automatisch LIFO- Datenstruktur: „Last In First Out“ effizient Festgelegte Größe, kann in einer IDE oder direkt am Betriebssystem verändert werden

Beispiel Stack Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); .

Beispiel Stack Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } Stack Pointer : Beginn des freien Speichers Frame Pointer : Start des aktuellen Stack Frames SP FP Call Stack int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . .

Beispiel Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } a (2, 2) SP FP Call Stack int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel o Reservierung von Speicher auf dem Call Stack für ein Vec 2 Objekt

Beispiel o Reservierung von Speicher auf dem Call Stack für ein Vec 2 Objekt und Initialisierung von a (2, 2) o SP wird um size. Of(Vec 2) erhöht. a (2, 2) SP o Da Vec 2 nur zwei int- Werte verwaltet hat dieser die Größe von 8 bytes, also erhöht sich der SP um 8 bytes. FP Call Stack

Beispiel b a ? SP (2, 2) FP Call Stack Vec 2 do. Something(Vec

Beispiel b a ? SP (2, 2) FP Call Stack Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel o Es wird für Vec 2 b Speicher auf dem Stack reserviert aber

Beispiel o Es wird für Vec 2 b Speicher auf dem Stack reserviert aber noch nicht initialisiert o Um b initialisieren zu können müssen wir b ? a (2, 2) SP die Methode do. Something(. . ) aufrufen o SP wird wieder um die Größe von Vec 2 erhöht FP Call Stack

Beispiel FP 0 x. FF… RV ? b ? a (2, 2) Call Stack

Beispiel FP 0 x. FF… RV ? b ? a (2, 2) Call Stack SP FP Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel o Vor dem Verlassen des Scopes wird folgendes vorbereitet: FP 0 x. FF…

Beispiel o Vor dem Verlassen des Scopes wird folgendes vorbereitet: FP 0 x. FF… RV ? b ? a (2, 2) Call Stack SP o RV: Speicherplatz für den return Value wird reserviert o RP: Rücksprungadresse wird gemerkt FP o FP: Frame Pointer Adresse wird gemerkt o FP wird auf den neuen Scope gesetzt o SP wird ebenfalls erhöht auf den nächsten freien Speicherbereich gesetzt

Beispiel. . . FP 0 x. FF… RV RV b ? a (2, 2)

Beispiel. . . FP 0 x. FF… RV RV b ? a (2, 2) Call Stack SP FP Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel. . . FP 0 x. FF… RV RV b ? a (2, 2)

Beispiel. . . FP 0 x. FF… RV RV b ? a (2, 2) Call Stack o Für alle Parameter und lokale Variablen SP werden ebenfalls Speicher auf dem Stack reserviert (Hier für die Vereinfachung mit „…“ dargestellt) FP o Der zurückgegebener Wert wird in RV gespeichert

Beispiel. . . FP 0 x. FF… RV b a RV RV SP (2,

Beispiel. . . FP 0 x. FF… RV b a RV RV SP (2, 2) FP Call Stack Vec 2 do. Something(Vec 2 param) { Vec 2 lokal(1, 7); . . . return Vec 2(. . . ); } int main() { Vec 2 a(2, 2); Vec 2 b = do. Something(a); }

Beispiel. . . FP 0 x. FF… RV o der Stack räumt auf o

Beispiel. . . FP 0 x. FF… RV o der Stack räumt auf o beim nächsten Aufruf werden die Daten überschrieben RV b RV a (2, 2) SP o SP und FP zeigen wieder auf die Adressen vor dem Methodenaufruf FP Call Stack o b wird initialisiert mit RV

Beispiel. . . FP 0 x. FF… RV o der Stack räumt auf o

Beispiel. . . FP 0 x. FF… RV o der Stack räumt auf o beim nächsten Aufruf werden die Daten überschrieben RV b RV a (2, 2) SP o SP und FP zeigen wieder auf die Adressen vor dem Methodenaufruf FP Call Stack o b wird initialisiert mit RV

Fazit Stack Beispiel Begrenzte Größe LIFO Datenstruktur Wächst und schrumpft im Programmverlauf Kein explizites

Fazit Stack Beispiel Begrenzte Größe LIFO Datenstruktur Wächst und schrumpft im Programmverlauf Kein explizites Freigeben des Speichers notwendig Sehr effizient

Fazit Stack Begrenzte Größe LIFO Datenstruktur Wächst und schrumpft im Programmverlauf Kein explizites Freigeben

Fazit Stack Begrenzte Größe LIFO Datenstruktur Wächst und schrumpft im Programmverlauf Kein explizites Freigeben des Speichers notwendig Sehr effizient

Fazit Stack Frage an euch Keine Referenzen (oder Pointer) auf ein lokales Objekt aus

Fazit Stack Frage an euch Keine Referenzen (oder Pointer) auf ein lokales Objekt aus der Funktion heraus exportieren Wenn Scope endet wird „result“ vom Stack geräumt und die übergebene Referenz zeigt auf einen ungültigen Speicher

Frage an euch Keine Referenzen (oder Pointer) auf ein lokales Objekt aus der Funktion

Frage an euch Keine Referenzen (oder Pointer) auf ein lokales Objekt aus der Funktion heraus exportieren Wenn Scope endet wird „result“ vom Stack geräumt und die übergebene Referenz zeigt auf einen ungültigen Speicher

Frage an euch Heap Dynamische Speicherverwaltung Heap Stack Statischer Speicher Programmspeicher o Dynamisch allozierte

Frage an euch Heap Dynamische Speicherverwaltung Heap Stack Statischer Speicher Programmspeicher o Dynamisch allozierte Objekte : Vec 2 bsp = new Vec 2(2, 2); o Alles was mit new erzeugt wird, wird auf dem Heap gespeichert o Heap ist wie ein Haufen, nicht strukturiert wie ein Stack o Heap kann während Laufzeit dynamisch wachsen

Heap Vec 2* p = new Vec 2(2, 2); o Zur Laufzeit wird nach

Heap Vec 2* p = new Vec 2(2, 2); o Zur Laufzeit wird nach einem freien Speicherplatz auf dem Heap angefragt ? o In unserem Beispiel von einer Bytegröße von size. Of(Vec 2) o Heap reserviert Speicherplatz und liefert Adresse zurück Heap

Heap Vec 2* p = new Vec 2(2, 2); o Zur Laufzeit wird nach

Heap Vec 2* p = new Vec 2(2, 2); o Zur Laufzeit wird nach einem freien Speicherplatz auf dem Heap angefragt (2, 2) o In unserem Beispiel von einer Bytegröße von size. Of(Vec 2) o Heap reserviert Speicherplatz und liefert Adresse zurück o Konstruktor wird aufgerufen und Objekt wird initialisiert Heap

Heap Vec 2* p = new Vec 2(2, 2); o Durch Zeiger haben wir

Heap Vec 2* p = new Vec 2(2, 2); o Durch Zeiger haben wir Zugriff auf Objekt auf dem Heap (2, 2) o p speichert die zurückgegebene Adresse auf dem Stack * Heap Stack p o p ist vom Typ Vec 2*, also ein Zeiger auf Vec 2

Heap Vec 2* p = new Vec 2[n]; o Reserviert zusammenhängenden Speicherblock für n

Heap Vec 2* p = new Vec 2[n]; o Reserviert zusammenhängenden Speicherblock für n Objekte vom Typ Vec 2 (funktioniert wie ein Array) o n muss nicht zur Compilezeit bekannt sein (0, 0) o Kann nur Default-Konstruktor von Vec 2 aufrufen (0, 0) o p hat nur Speicheradresse des ersten Objekts * Heap Stack p o Programmierer muss die Größe des Arrays selber verwalten, denn der Zeiger kann dies nicht

Heap Vec 2* p = new Vec 2[n]; o New erfordert immer ein delete,

Heap Vec 2* p = new Vec 2[n]; o New erfordert immer ein delete, um den Speicherplatz wieder freizugeben (0, 0) o Mit delete[ ] p geben wir den Speicher in unserem Beispielwieder frei (0, 0) o ABER der Zeiger existiert nach wie vor * Heap Stack p o Dangling Pointer : zeigt auf bereits freigegebenen Speicher

Heap Vec 2* p = new Vec 2[n]; o New erfordert immer ein delete,

Heap Vec 2* p = new Vec 2[n]; o New erfordert immer ein delete, um den Speicherplatz wieder freizugeben (0, 0) o Mit delete[ ] p geben wir den Speicher wieder frei (0, 0) o ABER der Zeiger existiert nach wie vor (0, 0) * Heap Stack p o Den Zeiger auf nullptr setzen so zeigt er auf nichts

Heap Vec 2* p = new Vec 2[n]; o Vergessen wir das delete haben

Heap Vec 2* p = new Vec 2[n]; o Vergessen wir das delete haben wir einen memory leak (0, 0) o Der Zeiger p referenziert jetzt auf ein neues Objekt auf dem Heap (0, 0) o Der Speicher von unserem Array kann nicht mehr freigegeben werden (0, 0) (2, 3) Heap * Stack p o Erst beim Programmende wird der Speicher wieder freigegeben

Heap Vec 2* p = new Vec 2[n]; o Vergessen wir das delete haben

Heap Vec 2* p = new Vec 2[n]; o Vergessen wir das delete haben wir einen memory leak (0, 0) o Der Zeiger p referenziert jetzt auf ein neues Objekt auf dem Heap (0, 0) o Der Speicher von unserem Array kann nicht mehr freigegeben werden (0, 0) (2, 3) Heap * Stack p o Erst beim Programmende wird der Speicher wieder freigegeben

Fazit Stack und Heap Stack hat festgelegte Größe, Heap wächst dynamisch zur Laufzeit Stack

Fazit Stack und Heap Stack hat festgelegte Größe, Heap wächst dynamisch zur Laufzeit Stack ist selbstorganisierend und effizient, Heap erfordert dass der Programmierer an die Speicherfreigabe denkt Heap erfordert in C++ immer Zeiger Zugriff langsamer

Fazit Stack und Heap Stack hat festgelegte Größe, Heap wächst dynamisch zur Laufzeit Stack

Fazit Stack und Heap Stack hat festgelegte Größe, Heap wächst dynamisch zur Laufzeit Stack ist selbstorganisierend und effizient, Heap erfordert dass der Programmierer an die Speicherfreigabe denkt Heap erfordert in C++ immer Zeiger Zugriff langsamer

Fazit Stackund und. Konstruktion Heap Allokation Malloc() und placement new Was passiert hier? Obj*

Fazit Stackund und. Konstruktion Heap Allokation Malloc() und placement new Was passiert hier? Obj* o = new Obj(1, 2, 3); 1. Speicher für ein Objekt vom Typ Obj wird allokiert 2. Konstruktor von Obj(1, 2, 3) wird aufgerufen

Allokation und Konstruktion Malloc() und placement new Was passiert hier? Obj* o = new

Allokation und Konstruktion Malloc() und placement new Was passiert hier? Obj* o = new Obj(1, 2, 3); 1. Speicher für ein Objekt vom Typ Obj wird allokiert 2. Konstruktor von Obj(1, 2, 3) wird aufgerufen

Allokation und Konstruktion Manchmal macht es Sinn diese beiden Schritte zu trennen 1. Speicher

Allokation und Konstruktion Manchmal macht es Sinn diese beiden Schritte zu trennen 1. Speicher für ein Objekt vom Typ Obj mit malloc() allokieren: Obj* speicher = static_cast<Obj*>(malloc(size. Of(Obj))); 2. Konstruktoraufruf mit placement new: new(speicher) Obj(1, 2, 3);

Allokation und Konstruktion Manchmal macht es Sinn diese beiden Schritte zu trennen 1. Speicher

Allokation und Konstruktion Manchmal macht es Sinn diese beiden Schritte zu trennen 1. Speicher für ein Objekt vom Typ Obj mit malloc() allokieren: Obj* speicher = static_cast<Obj*>(malloc(size. Of(Obj))); 2. Konstruktoraufruf mit placement new: new(speicher) Obj(1, 2, 3);

Vergleich und Fazit

Vergleich und Fazit

C++ und Java Fazit ÄHNLICHKEITEN VEREINFACHUNGEN IN JAVA o Primitive Datentypen o Keine Pointer

C++ und Java Fazit ÄHNLICHKEITEN VEREINFACHUNGEN IN JAVA o Primitive Datentypen o Keine Pointer – nur Referenzen o Syntax: Kontrollstrukturen o Keine Funktionen – static Methoden o Klassen, Sichtbarkeit(public, private) o Keine globalen Variablen – public static Variablen nutzen o Multiple Konstruktoren, this, new o Keine Destruktoren – garbage collection und finalize() o Packages in Java/namespaces in C++ o Keine Header-Dateien – stattdessen Interfaces o Keine Operatorenüberladung – nur Methodenüberladung o Keine Mehrfachvererbung – dafür mehrfache Implementierung von Interfaces möglich

C++ und Java Fazit ÄHNLICHKEITEN VEREINFACHUNGEN IN JAVA o Primitive Datentypen o Keine Pointer

C++ und Java Fazit ÄHNLICHKEITEN VEREINFACHUNGEN IN JAVA o Primitive Datentypen o Keine Pointer – nur Referenzen o Syntax: Kontrollstrukturen o Keine Funktionen – static Methoden o Klassen, Sichtbarkeit(public, private) o Keine globalen Variablen – public static Variablen nutzen o Multiple Konstruktoren, this, new o Keine Destruktoren – garbage collection und finalize() o Packages in Java/namespaces in C++ o Keine Header-Dateien – stattdessen Interfaces o Keine Operatorenüberladung – nur Methodenüberladung o Keine Mehrfachvererbung – dafür mehrfache Implementierung von Interfaces möglich

Danke für Eure Aufmerksamkeit

Danke für Eure Aufmerksamkeit