48
Architektur und Programmierung von Grafik- und Koprozessoren C++ Wiederholung Stefan Zellmann Lehrstuhl f¨ ur Informatik, Universit¨ at zu K¨ oln SS2018

C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Architektur und Programmierung von Grafik- undKoprozessoren

C++ Wiederholung

Stefan Zellmann

Lehrstuhl fur Informatik, Universitat zu Koln

SS2018

Page 2: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++

I Kompilierte Programmiersprache.I Ausgelegt auf hohe Laufzeit-Performance.

I “As opposed to”: hohe Performance beim Kompilieren, hoheEntwicklerproduktivitat, etc.

I Superset von ANSI-C. Unix: “Betriebssystem mitC-Compiler”.

I Standardisiert (aktuell: ISO/IEC 14882:2017(E)) (“C++17”).I C++11 Standard hat nach vielen Jahren grundlegende

Neuerungen mit sich gebracht. C++14 und C++17 eherInkremente.

I Geplant: jeder C++11/17/23/.. Standard “große”Anderungen, jeder C++14/20/26 inkrementelle Anderungen.

I Streng typisierte Sprache.

I Wir verwenden Features von C++11. NVIDIA CUDACompiler unterstutzt neuere Standards nicht oder nichtvollstandig.

Page 3: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Kompilieren und Linken eines Ausfuhrbares Programms

.cpp .o

.cpp .o

.cpp .o

Compiler Linker

a.out

ELF Executable

Page 4: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Statisches Linken

.cpp .o

.cpp .o

.cpp .o

Compiler Linker

a.out

ELF Executable

.h

Preprocessor

#include <png.h>

.a

-L/usr/lib -lpng

Page 5: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Dynamisches Linken

.cpp .o

.cpp .o

.cpp .o

Compiler Linker

a.out

ELF Executable

.h

Preprocessor

#include <png.h>

.lib

-L/usr/lib -lpng

.so

/usr/bin/ld

Dynamic Linker

Page 6: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Einsprungspunkt fur ausfuhrbare Dateien

int main(int argc , char** argv){

return 0;

}

Page 7: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Statements: <command>* ;

Funktionen: <return type> name (<param list>) {<body>}

Seit C++11 auch:auto name (<param list>) − > <return type> {<body>}

Page 8: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Kontrollstrukturen

// Comments

/* Comments */

if (condition) { } else if { } else {}

while (condition) {}

do { } while (condition );

for (long l = 0; l < 1000; ++l) {}

label:

goto label;

switch (i) {

case 0: break;

case 1: break;

default: break;

}

Page 9: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Programmstruktur: namespaces

// ANSI -C

struct myType {};

// C++

namespace my {

struct Type {};

}

void useLikeC () { myType mt; }

void useLikeCpp () {

my::Type mt;

{ using my::Type;

Type mt; }

{ using namespace my;

Type mt; }

}

Niemals: using namespace X; in Header! Namespace pollution.

Page 10: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Programmstruktur: Typen

struct type1 {

int a, b, c;

private:

int d_ , e_ , f_;

};

class type2 {

public:

type2 () {}

~type2() {}

private:

int a, b, c;

};

union u {

float f;

unsigned u;

};

Page 11: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr == 0, *ptr == 23

Page 12: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr++

Page 13: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr == 1, *ptr == 24

Page 14: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr += 3

Page 15: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr == 4, *ptr == 9

Page 16: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr -= 4

Page 17: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger: Abstraktionstyp fur linearen Speicher.

0 1 2 3 4 5 6 7

23 24 8 1 9 56 7 48

ptr == 0, *ptr == 23

Page 18: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Basiskonstrukte

Zeiger

Initialisiere Zeiger. Type* pointer = &data array[0];

(Achtung: Operator & hat drei verschiedene Bedeutungen in C++(Adressoperator, Referenzoperator, bitweises Und)).

Springe:pointer += 4;

Sprung vor den Anfang des Arrays:pointer -= 5;

Aus Sicht der Sprache legal (Compiler). Zur Laufzeit (bestenfalls):Memory Access Violation (Betriebssystem); womoglich: Zugriff aufbeliebigen Programmspeicher (Sicherheitslucke).

Dereferenzierung:Type t = *pointer;

Achtung, auch Operator * hat mehrere Bedeutungen.

Page 19: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++ und Ressourcen

C++ spezifiziert keine Garbage Collection (der Standard schließtsie nicht explizit aus, aber es gibt keine Implementierungen, die mirbekannt sind). Daher mussen alle Ressourcen, die reserviertwerden, wieder freigegeben werden, z. B.

// Dynamisches Array

int* ptr1 = new int [5];

delete [] ptr1;

// Datei Handle

FILE* fp = fopen("/home/user/filename", "rw");

fclose(fp);

// Netzwerk Socket

int sockfd = socket(AF_INET , SOCK_STREAM , 0);

close(sockfd );

Page 20: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++ und Ressourcen

Ressourcenallokation ⇒ (i. d. R.) System Calls:

I Reserviere Speicherbereich mit malloc oder new ⇒Betriebssystem gibt Zeiger auf Speicher zuruck (oder throwbad alloc).

I Offne Datei: Dateisystemoperation erfordert Kommunikationmit Betriebssystem.

I ...

System Calls: API des Betriebssystemkernels. User Mode LibraryFunktionen wie fopen oder new leiten an Kernel Mode SystemCalls (z. B. open, brk) weiter (oder erweitern sie).

Unix: verschiedene Man-Page Sektionen fur Library Funktionen (3)und System Calls (2):man 3 fopen

man 2 open

Page 21: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++ und Ressourcen

Ressource Acquisition is Initialization (RAII)

struct File {

File(char const* fn)

: fp(fopen(fn , "rw"))

{

}

~File()

{

fclose(fp);

}

FILE* fp;

};

void openFile () {

// Stack variable , dtor is automatically

// called when variable goes out of scope

File f("/home/user/myfile");

}

Page 22: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++ und Ressourcen

I Nutzen Sie RAII!

I Eingebaute, “deterministische” Garbage Collection. Destruktorwird garantiert aufgerufen, selbst wenn der Funktionsstackwegen Exceptions abgebaut wird.

I Prufen Sie immer erst, ob es fur Ihre Anwendung eine STL(oder Boost etc.) Template Klasse gibt (im Beispiel:std::fstream).

Page 23: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

C++ und Ressourcen

STL RAII Klassen:

// Dynamic arrays

#include <vector >

std::vector <int > v1(3); v1.push_back (4);

v1[2] = 23;

// Smart pointers

#include <memory >

std:: shared_ptr <int > sp = nullptr;

std:: unique_ptr <int > up = nullptr;

// File handling

#include <fstream >

std:: ofstream file("/home/user/myfile");

file << "text";

I Viele andere Beispiele!

I Vorsicht mit std::shared ptr, sehr schwergewichtig.

Page 24: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Fundamentaltypen

Booleans, Characters, sonst.

void; std:: nullptr_t;

bool; char;

Integer Typen

short; int; long; long long; // + unsigned etc.

Datenmodelle, z. B. LP64 (64-bit Unix,Linux, Mac): long &pointer 64-bit, LLP64 (Win64): long 32-bit, pointer 64-bit.

Floating-Point Typen

float; double; long double;

Typeigenschaft

static_assert(std:: is_fundamental <T>:: value == true);

Page 25: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Zusammengesetzte Typen

Typ ist eines von: Array, Funktion, Zeiger auf Objekt,Zeiger auf Funktion, Zeiger auf Member, Referenz,Klasse, Union oder Enumeration.

Typeigenschaft

static_assert(std:: is_compound <T>:: value == true);

Page 26: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Typkategorien

Wichtige:

I trivial - std::is trivial

I POD - std::is pod

Page 27: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Triviale Typen

Trivialer Default Konstruktor

// Generated

struct type1 { int i; };

// Defaulted:

struct type2 {

type2 () = default;

int i;

}

// Not trival:

struct type2 {

type2 () {}

int i;

}

Trivial kopierbar

type1 a, b, c;

b = a; memcpy (&c, &b, sizeof(b));

Typeigenschaft

static_assert(std:: is_trivial <T>:: value == true);

Page 28: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

POD Typen

“Plain Old Data Types”Standard Layout Ist bitweise kompabitel mit einfachem ANSI-CTypen, insb. bzgl. Reihenfolge der Member Felder.

struct type1 { int i; }; // standard -layout

struct type2 : type1 { }; // standard -layout

struct type3 : type2 { }; // standard -layout

struct type4 : type2 , type3 { }; // kein standard -layout

Typeigenschaft

static_assert(std::is_pod <T>:: value == true);

Page 29: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Einfache Typen (Trivial, POD)

I Zeichnen sich insb. dadurch aus, dass sie mit einfachemmemcpy im Speicher bewegt werden konnen.

I Keine virtuelle Vererbung ⇒ keine erst zur Laufzeit bekanntenKonstrukte.

I Einfache Typen besser fur Optimizer. In inneren Schleifensollten einfache Typen oder Varianten verwendet werden.

Page 30: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Smart Pointer und Referenzzahlen

Prinzip sehr einfach (konkrete Implementierung nicht..). CopyKonstruktor zahlt ref-count hoch, Destruktor zahlt ref-countrunter, loscht wenn ref-count 0.

Page 31: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Smart Pointer und Referenzzahlen

struct smart_ptr {

smart_ptr(Object* o) : obj_(o), cnt_(new int) {

*cnt_ = 1;

}

smart_ptr(smart_ptr& rhs) : obj_(rhs.obj_)

, cnt_(rhs.cnt_) {

*cnt_ ++;

}

~smart_ptr () {

if (--(*cnt_) == 0) {

delete obj_;

delete cnt_;

}

}

// Interface

Object& operator *() { return *obj_; }

Object* operator ->() { return obj_; }

// Data

Object* obj_;

int* cnt_;

};

Page 32: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Smart Pointer und Referenzzahlen

Ownership

Problem: wem gehort der Speicher. Bei dem Smart Pointer vonoben geht man davon aus, dass Ownership geteilt wird (daherReferenzzahlung). Tatsachliche Implementierungen (z. B.std::shared ptr, boost::shared ptr) recht schwergewichtig(insb. wegen Thread Safety).

Wenn klar ist, dass Datum, auf das gezeigt wird, nie geteilt wird,verwende exklusiven Smart Pointer (z. B. std::unique ptr).Dieser implementiert RAII, aber keine Verweiszahlung ⇒ kaumVerwaltungs-Overhead.

Page 33: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung

// returns any linear container (e.g. std:: vector)

auto container = generate_some_numbers ();

// sort any linear container

std::sort(container.begin(), container.end ());

std::sort ist ein Algorithmus, d. h. (im Sinne von C++) eineFunktion, die fur verschiedene Eingabetypen templatisiert ist(insb.: die beiden Parameter first und last erfullen dasRandomAccessIterator Konzept).

Page 34: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung

template <typename T>

struct generic_type {

T data;

};

template <typename T>

void generic_func(T param) {

}

int main() {

generic_type <int > gti;

using concrete_type = generic_type <double >;

concrete_type ctd;

generic_func(gti.data); // Instantiate with int

generic_func(ctd.data); // Instantiate with double

}

Page 35: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung

STL und Boost stellen eine Vielzahl von Template Klassen undFunktionen bereit:

std::vector <int >;

std::list <double >;

std::map <int , char >;

boost::bimap <int , std::string >;

boost:: circular_buffer <double >;

//...

Page 36: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung

STL und Boost stellen eine Vielzahl von Template Klassen undFunktionen bereit:

template <typename InputIt , typename T>

std::find(InputIt first , InputIt last , T value);

template <typename InputIt , typename T, typename Pred >

std:: find_if(InputIt first , InputIt , Pred pred);

template <typename RandomIt >

std::sort(RandomIt first , RandomIt last);

template <typename RandomIt , typename Compare >

std::sort(RandomIt first , RandomIt last , Compare comp);

//...

std:: accumulate (..);

std:: rotate (..);

std:: partition (..);

Page 37: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung

ConceptsKonzepte (engl./gebrauchlicher: Concepts) legen fest, welcheTypen mit welchem Algorithmus etc. kompatibel sind.

Beispielsweise EqualityComparable: fur den Typen ist dieFunktion operator==() uberladen, das Ergebnis vonoperator==() ist implizit nach bool konvertierbar.

Generische Programmierung erlaubt Compile Zeit Polymorphismus- also das Erweitern von Template Library Algorithmen durchuberschreiben fur eigene Typen - ohne Laufzeit Overhead (aberggf. hohere Compile Zeiten und Code Komplexitat).

Page 38: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung – Patterns

Iterator Pattern

template <typename Container >

void iterate(Container cont) {

for (auto it = cont.begin (); it != cont.end (); ++it) {

std::cout << *it << ’\n’;

}

}

int main() {

std::vector <int > v({1,2,3,4,5});

iterate(v);

std::list <double > l({1.0 ,2.0 ,3.0});

iterate(l);

}

Page 39: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung – Patterns

Iterator Pattern Haufig wird generisch uber eine range iteriert.Dann gilt (STL, Boost, andere):

range := [container.begin..container.end)

Der end (manchmal last Iterator zeigt also auf das (ungultige)Element direkt nach dem letzten Elemet.

Beim iterieren pruft man auf Ungleichheit (it != end anstatt it< end), um Datenstrukturen zu unterstutzen, uber die nichtsequentiell iteriert wird.

Zeiger erfullen das RandomAccessIterator Konzept.

Page 40: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung – Patterns

Type Traits (Typeigenschaften)

struct my_type { };

template <typename T>

struct is_my_type {

static constexpr bool value = false; };

template <>

struct is_my_type <my_type > {

static constexpr bool value = true; };

template <typename T>

void func(T) {

std::cout << is_my_type <T>:: value << ’\n’; }

int main() {

func(int {});

func(my_type {});

}

Page 41: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung – Patterns

SFINAE (Substitution failure is not an Error)

template <typename T>

void func(T x)

{

std::cout << x.pretty_sure_this_member_doesnt_exist;

}

void func(int i)

{

std::cout << i;

}

int main()

{

func (23);

}

Page 42: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Generische Programmierung – Patterns

SFINAE (Substitution failure is not an Error)

template <typename I,

typename = typename std::enable_if <

std:: is_integral <I>::value >:: type

>

void func(I)

{

}

int main()

{

func (23);

func(std::vector <int >()); // Error!

}

Page 43: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Lambda Funktionen

void func() {

// Simple

auto mul = []( int i, int j) { return i * j; };

mul(23, 32);

// Algorithm

struct record { int key; std:: string value; }

std::vector <record > records;

std::sort(records.begin(), records.end(),

[]( record a, record b)

{ return a.key < b.key; });

// Parallel algorithm

parallel_for(range.begin(), range.end(), []( index i)

{

// Parallel logic

});

}

Page 44: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Lambda Funktionen

void func() {

int a, b;

std::vector <int > c;

// Capture by value

auto do_it1 = [a,b,c]() { a = 23; // a is copy

c.push_back (0); // c is copy!

};

// Capture c by reference

auto do_it2 = [a,b,&c]() { /* .. */ };

// Capture everything by value

auto do_it3 = [=]() { std::cout << a << ’\n’ };

// Capture everything by reference

auto do_it4 = [&]() { c.push_back (23); }

}

Page 45: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Lambda Funktionen

Lambda Funktionen sind Funktionsobjekte. Ihr Typ istCompiler-spezifisch, jedoch sind sie implizit nachstd::function<> konvertierbar. Sie erleichtern Situationen, indenen man vor C++11 Helferklassen hatte schreiben mussen.

Page 46: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Move Semantik und Return Value Optimization

C++11 Konstrukt. Prinzip: anstatt copy-by-value oderreferenzieren eines großen Objekts, verschiebe es einfach in einenanderen Scope (im ursprunglichen Scope wird es ungultig).

Wahrscheinlich grßter Nutzen beim Kopieren vonFunktionsruckgabewerten:

struct BIG {

char data[0xFFFF ];

};

BIG tmp = make_BIG ();

Alte C++ Compiler legen hier zwei Temporaries an! Es gibt aberkeine Situation, in der man an die Temporaries gelangen kann,deshalb optimieren Compiler (auch < C++11) dies mit MoveSemantics (sog. Return Value Optimization).

Page 47: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Move Semantik und Return Value Optimization

struct BIG {

char data[0xFFFF ];

};

void func(BIG big) { // Copy 2^16 bytes

}

void func(BIG& big) { // Reference

}

BIG func() {

return BIG {}; // Since C++11: move semantics

}

BIG soon_no_longer_required;

BIG big = std::move(soon_no_longer_required );

// 1st variable is now also no longer *valid*

Page 48: C++ Wiederholung Stefan Zellmann SS2018C++ und Ressourcen C++ spezi ziert keine Garbage Collection (der Standard schlieˇt sie nicht explizit aus, aber es gibt keine Implementierungen,

Tutorials

Bitte schauen Sie sich die “richtigen” Tutorials an! Viele Tutorialsvermitteln C++ im Stil anderer Sprachen wie C oder Java.“Richtige” Tutorials sind z. B.

Channel9 Lectures: Stephan T. Lavavej - Core C++https://channel9.msdn.com/Series/

C9-Lectures-Stephan-T-Lavavej-Core-C-

Jason Turner: C++ Weekly (YouTube Channel)

Sehr unterhaltsames Tutorial:CppCon 2016: Jason Turner, ”Rich Code for Tiny Computers: ASimple Commodore 64 Game in C++17”.(YouTube)