C++ Flashcards

1
Q

Welche Art von Programmiersprache ist C++?

A

Kompilierte Programmiersprache

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Was sind Unterschiede von C++ zu C#?

A

Klassen werden in zwei Dateien geschrieben (Deklaration .h, Defintiion .cpp)
Memory Management muss selbst gemacht werden (Pointer!)
Mehrfachvererbung
Keine Interfaces
Keine Delegates

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Was macht der Compiler?

A

Dieser geht einmal den gesamten Code durch und baut sich Object Files zusammen - falls hier Fehler entstehen, kommt es zu Linker-Errors.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Was macht der Linker?

A

Der Linker ersetzt Placeholder mit echtem Code und baut diesen in die Executable ein

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Was ist ein Preprocessor?

A

Code oder Macros, die vor der Kompilierung ausgeführt werden

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Wie ist der Speicher aufgeteilt?

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Was sind Pointer?

A

Pointer sind Adressdatentypen, die auf Daten im Speicher zeigen (Pointer haben den selben Datentyp wie die Daten, auf die sie zeigen)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Was ist der Address Of Operator? Was ist der Dereference Operator?

A

& = Address Of Operator, wo auf die Speicheradresse direkt zugegriffen werden kann
* = Dereference Operator, mit dem man auf Daten hinter einer Adresse zugreifen kann

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Was ist die Schnellschreibweise des Dereference Operators?

A

student->id (statt (*student).id)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wie funktionieren Pointer in Arrays?

A

Pointer können auf spezifische Zellen im Array zeigen –> mit Pointer Arithmetik kann man dann einfach auf andere Zellen springen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Was ist Pointer Arithmetik?

A

Durch das Dazurechnen von Werten in Adressen kann einfach im Speicher herumgesprungen werden (Verwendung bei Arrays für Iteration)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Was ist der Heap?

A

= 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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Wie werden Referenzen an Methoden übergeben?

A

& 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Was ist der grundlegende Unterschied zwischen Klassen und Structs?

A

Bei Klassen ist die Sichtbarkeit standardmäßig private, bei Structs public

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Wie kann der Default-Konstruktor in C++ gelöscht werden?

A

Konstruktor() = delete;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Welche Methoden werden bei C++ Klassen automatisch generiert?

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Wie funktionieren Deep Copies in C++?

A

Über den Copy Konstruktor - dieser muss selbst definiert werden und enthält immer eine const Referenz als Parameter

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Was ist Copy by Assignment in C++?

A

Daten werden kopiert, aber die alten Daten werden auch gleichzeitig gelöscht

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Was ist die grundlegende Reihenfolge bei Copy by Assignment Programmierung?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Wann verwendet man Deep Copy? Wann Shallow Copy?

A

Shallow copy für Objekte, die keine Pointer verwenden
Deep copy für Objekte, die Pointer enthalten

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Was ist die C++ Rule of Three?

A

Wenn eines der Folgenden definiert ist, dann sollten die restlichen Methoden ebenso implementiert werden:

Destructor
Copy Constructor
Copy Assignment Operator

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Wie verhindert man das Kopieren von Klassen in C++?

A

Beim Copy-Constructor und Copy Assignment Operator “= delete;” anhängen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Was ist Object Slicing? Wie kann dies verhindert werden?

A

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

24
Q

Was ist der Unterschied zwischen Static und Dynamic Binding?

A

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

25
Q

Was ist Dynamic Binding?

A

Beispiel: virtual Keyword bei Methoden
Mit override kann eine erbende Klasse die Funktion der Elternklasse überschreiben

26
Q

Wofür verwendet man virtuelle Destruktoren?

A

Eine Basisklasse sollte einen virtuellen Destruktor haben, um Object Slicing zu verhinden, da Kinderklassen einfach einen eigenen Destruktor implementieren können

27
Q

Wie erstellt man Interfaces in C++?

A

Interfaces in C++ sind eigentlich nur Abstrakte Basisklassen mit puren virtuellen Funktionen (vPrint() = 0)

28
Q

Was sind Forward Declarations?

A

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

29
Q

Was macht das const Keyword in C++?

A

Werte unveränderlich machen

30
Q

Was ist Promotion in C++?

A

Wenn ein kleinerer Datentyp zu einem größeren gecasted wird (short to int)

31
Q

Was ist ein gutes Vorgehen, was Casting in C++ betrifft?

A

Keine explicit casts ((int) num), sondern über “advanced” casts

static_cast<int>(num)
dynamic_cast<int>(num)</int></int>

32
Q

Was ist der Vorteil bei der Nutzung von static_cast?

A

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

33
Q

Was ist dynamic_cast?

A

Dynamic Cast wird nur bei polymorphen Klassen verwendet und es kann bei runtime gecheckt werden, ob der Cast erfolgreich war

34
Q

Was ist reinterpret_cast?

A

Konvertiert einen Pointer zu einem anderen Pointertypen - verändert ebenso die Daten bei der Adresse

35
Q

Was macht typeid?

A

Gibt es Typen des Objekts zurück - ist je nach Compiler unterschiedlich

36
Q

Welche Container gibt es in C++?

A

Vector (std::vector), List (std::list), Dictionary (std::map, std::unordered_map), Set (std::set, std::unordered_set)

37
Q

Was sind Iterator in C++?

A

Iterator werden verwendet als access-Methode für Klassen, um z.B. durch Container-Klassen leichter zu iterieren

38
Q

Was ist der Unterschied zwischen einer Map und einem Set?

A

Bei einer Map kann direkt auf Inhalte zugegriffen werden, bei Sets werden Suchoperationen gestartet

39
Q

Was ist das Auto Keyword?

A

Wie in C# das war, was automatisch den Datentyp erkennt
Praktisch für Iterationen, um diese leserlicher zu machen (ranged-based for loop)

40
Q

Was sind Aggregate Initializations?

A

initializer für Klassen oder Arrays, die schneller und leserlicher sind:

struct Aggregate { int i; int j; };
struct NotAggregate { NotAggregate() {}; int i; int j; };

41
Q

Was sind Smart Pointer? Welche Smart Pointer gibt es? Erkläre diese.

A

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

42
Q

Wieso möchte man Operatoren overloaden?

A

Um Funktionscalls zu replacen (overloaden von + bei Vektoren für eine schnelle Addition - besser leserlicher Code)
kommt ebenso bei Strings zum Einsatz

43
Q

Was sind Lambda Ausdrücke? Wie sind diese aufgebaut?

A

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;
});

44
Q

Was sind Pre-Compiled Headers? Was sind gute Kandidaten für Pre-Compiled Headers?

A

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

45
Q

Was sind Libraries? Gibt es Unterschiede zwischen Static und Dynamic Libraries?

A

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)

46
Q

Was sind Vor- und Nachteile von statischen Bibliotheken?

A

+ 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

47
Q

Was sind Vor- und Nachteile von dynamischen Bibliotheken?

A

+ 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

48
Q

Wie funktioniert static in C++?

A

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

49
Q

Wie erstellt man eine Singleton Klasse richtig in C++?

A

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; }
50
Q

Wie kann Speicher Management in C++ optimiert werden?

A

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)

51
Q

Wie kann die CPU optimiert werden in C++?

A

Moderne C++ Features verwenden - Move Semantiken, Lambdra Ausdrücke, Constexpr, Threading, Async, Futures

52
Q

Wie kann die GPU optimiert werden in C++?

A

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)

53
Q

Wie können I/O Operationen, Netzwerk Kommunikation und Datenverwaltung optimiert werden in C++?

A

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

54
Q

Wie können Grafiken, Audio und Physik optimiert werden in C++?

A

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)

55
Q

Welche unterstützende Methoden /Datenstrukturen bietet C++ für Multithreading?

A

Threads
mutex, lock_guard, unique_lock
condition_variable
atomic
future
async

56
Q

Wie funktioniert Serialisierung in C++?

A

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