C++ Flashcards
Welche Art von Programmiersprache ist C++?
Kompilierte Programmiersprache
Was sind Unterschiede von C++ zu C#?
Klassen werden in zwei Dateien geschrieben (Deklaration .h, Defintiion .cpp)
Memory Management muss selbst gemacht werden (Pointer!)
Mehrfachvererbung
Keine Interfaces
Keine Delegates
Was macht der Compiler?
Dieser geht einmal den gesamten Code durch und baut sich Object Files zusammen - falls hier Fehler entstehen, kommt es zu Linker-Errors.
Was macht der Linker?
Der Linker ersetzt Placeholder mit echtem Code und baut diesen in die Executable ein
Was ist ein Preprocessor?
Code oder Macros, die vor der Kompilierung ausgeführt werden
Wie ist der Speicher aufgeteilt?
Globaler Speicher (fixe Größe, enthält globale Variablen) und der Stack (lokale Variablen und Function Calls - verlässt man den Scope wird alles vom Stack freigegeben)
Was sind Pointer?
Pointer sind Adressdatentypen, die auf Daten im Speicher zeigen (Pointer haben den selben Datentyp wie die Daten, auf die sie zeigen)
Was ist der Address Of Operator? Was ist der Dereference Operator?
& = Address Of Operator, wo auf die Speicheradresse direkt zugegriffen werden kann
* = Dereference Operator, mit dem man auf Daten hinter einer Adresse zugreifen kann
Was ist die Schnellschreibweise des Dereference Operators?
student->id (statt (*student).id)
Wie funktionieren Pointer in Arrays?
Pointer können auf spezifische Zellen im Array zeigen –> mit Pointer Arithmetik kann man dann einfach auf andere Zellen springen
Was ist Pointer Arithmetik?
Durch das Dazurechnen von Werten in Adressen kann einfach im Speicher herumgesprungen werden (Verwendung bei Arrays für Iteration)
Was ist der Heap?
= Dynamischer Speicher, alle Daten die mit new angelegt werden
Daten die mit new angelegt werden, müssen mit delete wieder freigemacht werden (verhindert Memory Leaks)
Wie werden Referenzen an Methoden übergeben?
& beim Parameter hinzufügen (mit const garantiert man, dass die Referenzen sich nicht verändern)
Dies ist besser für die Performance, da dann die Objekte nicht kopiert werden
Was ist der grundlegende Unterschied zwischen Klassen und Structs?
Bei Klassen ist die Sichtbarkeit standardmäßig private, bei Structs public
Wie kann der Default-Konstruktor in C++ gelöscht werden?
Konstruktor() = delete;
Welche Methoden werden bei C++ Klassen automatisch generiert?
Leerer Default-Konstruktor: Konstruktor()
Destructor: ~Konstruktor() –> kein Rückgabewert, wird automatisch aufgerufen on delete
Copy Constructor: Konstruktor(const Konstruktor& rhv)
Copy Assignment Operator: Konstruktor& operator= (const Konstruktor& rhv)
Wie funktionieren Deep Copies in C++?
Über den Copy Konstruktor - dieser muss selbst definiert werden und enthält immer eine const Referenz als Parameter
Was ist Copy by Assignment in C++?
Daten werden kopiert, aber die alten Daten werden auch gleichzeitig gelöscht
Was ist die grundlegende Reihenfolge bei Copy by Assignment Programmierung?
Zuerst Self-Assignment checken
Bereits assigned Data frei machen, wenn das Objekt die Data besitzt
Referenz zum Target Objekt zurückgeben für Ketten-Assignments
Wann verwendet man Deep Copy? Wann Shallow Copy?
Shallow copy für Objekte, die keine Pointer verwenden
Deep copy für Objekte, die Pointer enthalten
Was ist die C++ Rule of Three?
Wenn eines der Folgenden definiert ist, dann sollten die restlichen Methoden ebenso implementiert werden:
Destructor
Copy Constructor
Copy Assignment Operator
Wie verhindert man das Kopieren von Klassen in C++?
Beim Copy-Constructor und Copy Assignment Operator “= delete;” anhängen
Was ist Object Slicing? Wie kann dies verhindert werden?
Object Slicing entsteht in C++, bei folgendem Code-Snippet:
person = student;
Man geht davon aus, dass Student von Person erbt - es ist für den Compiler okay, diese Zeile Code zu enthalten, allerdings gehen Daten verloren, weil die Person Klasse keine zusätzlichen Daten der Student Klasse halten kann.
Bei Pointern würde dieses Problem nicht entstehen, da Pointer nur einen Verweis auf die Adresse im Speicher halten - allerdings geht dies nur, wenn wirklich ein Student auf eine Person assigned wird und nicht anders rum
Was ist der Unterschied zwischen Static und Dynamic Binding?
Static vs. Dynamic Binding
Frühes Binding vs. Spätes Binding
Bekannt bei Kompilierung vs. bekannt bei Laufzeit
Effizientere Performance vs. weniger effizient wegen Runtime Lookup
Pointer Typ definiert, welche Methode aufgerufen wird vs. Flexibilität
Was ist Dynamic Binding?
Beispiel: virtual Keyword bei Methoden
Mit override kann eine erbende Klasse die Funktion der Elternklasse überschreiben
Wofür verwendet man virtuelle Destruktoren?
Eine Basisklasse sollte einen virtuellen Destruktor haben, um Object Slicing zu verhinden, da Kinderklassen einfach einen eigenen Destruktor implementieren können
Wie erstellt man Interfaces in C++?
Interfaces in C++ sind eigentlich nur Abstrakte Basisklassen mit puren virtuellen Funktionen (vPrint() = 0)
Was sind Forward Declarations?
Sind Deklarationen, mit denen man Circular Dependency umgehen kann, da durch Forward Deklarationen der Compiler gesättigt wird und dieser weiß, welche Klassen zu erwarten ist
Was macht das const Keyword in C++?
Werte unveränderlich machen
Was ist Promotion in C++?
Wenn ein kleinerer Datentyp zu einem größeren gecasted wird (short to int)
Was ist ein gutes Vorgehen, was Casting in C++ betrifft?
Keine explicit casts ((int) num), sondern über “advanced” casts
static_cast<int>(num)
dynamic_cast<int>(num)</int></int>
Was ist der Vorteil bei der Nutzung von static_cast?
Beim Compilen kommt es zu Fehlern, wenn der Cast nicht möglich ist - allerdings keine Garantie, ob der Cast funktioniert hat (undefined behaviour) - wird für Klassen verwendet
Was ist dynamic_cast?
Dynamic Cast wird nur bei polymorphen Klassen verwendet und es kann bei runtime gecheckt werden, ob der Cast erfolgreich war
Was ist reinterpret_cast?
Konvertiert einen Pointer zu einem anderen Pointertypen - verändert ebenso die Daten bei der Adresse
Was macht typeid?
Gibt es Typen des Objekts zurück - ist je nach Compiler unterschiedlich
Welche Container gibt es in C++?
Vector (std::vector), List (std::list), Dictionary (std::map, std::unordered_map), Set (std::set, std::unordered_set)
Was sind Iterator in C++?
Iterator werden verwendet als access-Methode für Klassen, um z.B. durch Container-Klassen leichter zu iterieren
Was ist der Unterschied zwischen einer Map und einem Set?
Bei einer Map kann direkt auf Inhalte zugegriffen werden, bei Sets werden Suchoperationen gestartet
Was ist das Auto Keyword?
Wie in C# das war, was automatisch den Datentyp erkennt
Praktisch für Iterationen, um diese leserlicher zu machen (ranged-based for loop)
Was sind Aggregate Initializations?
initializer für Klassen oder Arrays, die schneller und leserlicher sind:
struct Aggregate { int i; int j; };
struct NotAggregate { NotAggregate() {}; int i; int j; };
Was sind Smart Pointer? Welche Smart Pointer gibt es? Erkläre diese.
Datentyp, der einen atomaren Integer hinterlegt hat, der schaut, wie viele Ressourcen schauen auf “mich” - wenn der Counter auf 0 ist, löscht sich der Smart Pointer von selbst.
shared_ptr - die Standarddefinition eines Smart Pointers mit Referenzzähler
weak_ptr - hält kein Objekt, sondern schaut nur auf die Lifetime (vermeidet Circular Reference Problem - kann genutzt werden um zu schauen, ob Objekt überhaupt noch existiert - man kann von einem weak_ptr einen shared_ptr erhalten)
unique_ptr - bei einem unique_ptr kann das Objekt nur einen Owner haben - mit move kann das Ownership transferiert werden
Wieso möchte man Operatoren overloaden?
Um Funktionscalls zu replacen (overloaden von + bei Vektoren für eine schnelle Addition - besser leserlicher Code)
kommt ebenso bei Strings zum Einsatz
Was sind Lambda Ausdrücke? Wie sind diese aufgebaut?
Lambda Ausdrücke sind anonyme Funktionsobjekte die als Parameter übergeben werden können oder allgemein deklariert werden können
[]() -> bool {}
[] -> Welchen Scope will ich mitgeben? (= ist für Zugriff auf alles im Scope, & für alle Referenzen - aber es ist besser immer explizitly zu capturen (also variablen mitgeben)
() -> Parameterliste
{} -> Körper der Funktion
Return-Typ des Lambdra Ausdrucks steht rechts vom Pfeil
Beispiel:
[](const int& lhv, const int& rhv)
{
return lhv < rhv;
});
Was sind Pre-Compiled Headers? Was sind gute Kandidaten für Pre-Compiled Headers?
Eine Header-File, die viele oft verwendete Header verwendet (stdafx.h / pch.h)
Gute Kandidaten ist Code, der selten verändert wird –> windows.h, container klassen (vector, map…)
Schlechte Kandidaten ist Code vom eigenen Projekt oder Code, der oft verändert wird
Was sind Libraries? Gibt es Unterschiede zwischen Static und Dynamic Libraries?
Libraries bieten wiederverwendbare Funktionen in binärer Form an - kompilierter Maschinencode
Dabei ist zu unterscheiden zwischen Static (Windows.lib) und Dynamic (Windows.dll) Libraries
Static Libraries werden durch den Linker in die Executable kopiert (Funktionsadresse schon beim Linken bekannt), während Dynamic Libraries bei Runtime in die Executable geladen werden (Funktionsadresse muss gefunden werden bei Laufzeit)
Was sind Vor- und Nachteile von statischen Bibliotheken?
+ Nur gebrauchter Code wird kopiert
+ keine Versionskonflikte
+ schnellere Startup-Zeiten
+ Weniger Files beim Deployen
- Speicherplatzverschwendung, da kompilierter Code immer kopiert wird
- Updaten der Bibliothek erfordert eine Rekompilierung
Was sind Vor- und Nachteile von dynamischen Bibliotheken?
+ nur Entrypunkte der Bibliothek werden ins Programm kompiliert
+ Code kann bei Runtime geladen werden und nur wenn notwendig
+ Programm wird erweitert, ohne Zugang zum Source Code
+ Bibliothek kann geupdated werden, ohne zu rekompilieren
- Programm benötigt mehrere Dateien
- Konflikt zwischen verschiedenen Bibliotheksversionen
- Langsamere Ausführung / Exekution
Wie funktioniert static in C++?
Lokale static Variablen beim ersten Mal ausführen erstellt und die Werte werden beibehalten, bis das Programm beendet worden ist
Statische Attributen werden über alle Instanzen einer Klasse geteilt, statische Methoden können aufgerufen werden, ohne eine Klasse zu instanziieren
Wie erstellt man eine Singleton Klasse richtig in C++?
class Singleton
{
public:
static Singleton& getInstance();
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton& s) = delete;
Singleton& operator=(const Singleton& s) = delete;
}
Singleton& Singleton::getInstance()
{
static Singleton instance;
return instance; }
Wie kann Speicher Management in C++ optimiert werden?
Mit Smart Pointern (Smart Pointer immer über Raw Pointern verwenden, wenn möglich)
Konservativ sein mit Speicher Budgets (vermeide zu viele Allokationen und nicht-verwendete Ressourcen zu lange zu halten)
Thrashing vermeiden (Kleine Memory Chunks werden oft allokiert und deallokiert - sorgt für Fragmentation und Overheads - Lösung: Speicher Pools)
Wie kann die CPU optimiert werden in C++?
Moderne C++ Features verwenden - Move Semantiken, Lambdra Ausdrücke, Constexpr, Threading, Async, Futures
Wie kann die GPU optimiert werden in C++?
Culling - Technik zum Vemeiden von sinnlosen Renders (Frustum, Occlusion, Backface)
Batching - Technik um Draw-Calls, die an GPU geschickt werden, zu reduzieren (Static, Dynamic - dynamische Objekte mit gleichen Properties werden in ein Mesh kombiniert, Instancing - mehrere Kopien vom selben Objekt mit verschiedenen Transformationen in einem Draw Call)
Wie können I/O Operationen, Netzwerk Kommunikation und Datenverwaltung optimiert werden in C++?
Anzahl und Größe der I/O Operationen klein halten
asynchrone / multithreaded I/O handling betreiben
Oft verwendete Daten cachen
Daten komprimieren
Effiziente Datenformate und Protokolle für Serialisierung verwenden
Network Nachrichten batchen (gruppieren), um Latenz und Overheads zu reduzieren
Wie können Grafiken, Audio und Physik optimiert werden in C++?
LODs verwende (Polygon Anzahl reduzieren auf Distanz)
Occlusion Culling
Frustum Culling
Instancing
Batching
Dynamische Lichter und Schatten sehr sparend verwenden
Nummer und Lifetime von Partikeln limitieren
Audio Quellen mit Spatialization und Attenuation verwenden
Korrekte Audio-Formate (mp3, ogg) verwenden - spart Speicherplatz und Speicherverwendung beim Abspielen
Simple Kollisionsformen verwenden
Rigidbody Sleep Mode verwenden (Physikkollisionen für statische / nicht-interagierende Objekte ausschalten)
Welche unterstützende Methoden /Datenstrukturen bietet C++ für Multithreading?
Threads
mutex, lock_guard, unique_lock
condition_variable
atomic
future
async
Wie funktioniert Serialisierung in C++?
Es ist zu unterscheiden zwischen Text und Binärer Synchronisierung - Text ist leichter zum Debuggen, während Binäre Dateien grundsätzlich weniger CPU Zyklen brauchen.
Es sollten nur Objekte, die nicht berechnet werden können von anderen Daten, serialisiert werden (Pointer können nicht serialisiert werden - dafür aber GUID)
Es kommt das Serializer Design Pattern zum Einsatz - wo alle einzelnen Serializer (XML, JSON, Binary) von einer Klasse die Funktion “serialize(string value)” erben - jeder einzelne Serializer hat dann auch eine ReadSerializer und eine WriteSerializer Methode