Das C++- Speichermodell. Rainer Grimm Schulungen, Coaching und Technologieberatung
|
|
- Hilke Reuter
- vor 6 Jahren
- Abrufe
Transkript
1 Das C++- Speichermodell Rainer Grimm Schulungen, Coaching und Technologieberatung
2 Multithreading mit C++11 C++'s Antwort auf die Anforderungen der Multicore- Architekturen. Ein definiertes Speichermodell Atomare Operationen Partielle Ordnung von Operationen Sichtbare Effekte von Operationen Eine standardisierte Threading-Schnittstelle Threads und Tasks Schutz und sicheres Initialisieren der Daten Thread-lokale Daten Synchronisation der Threads
3 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
4 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
5 Der Vertrag Entwickler respektiert die Regeln atomare Operationen Partielle Ordnung von Operationen Speichersichtbarkeit System besitzt die Freiheit zu optimieren Compiler Prozessor Speicherebenen Hoch optimiertes Programm, das auf die Plattform zugeschnitten ist.
6 Der Vertrag Mehr Optimierungspotential für das System Anzahl der möglichen Kontrollflüsse steigt exponentiell Zunehmend ein ausschließliches Gebiet für Domänexperten Bruch der Intuition Feld für Mikrooptimierung
7 Der Vertrag Sequenzielle Konsistenz Strong Memory Model Globaler Zeitgeber Speichermodell für Java und C# Bruch der Sequenziellen Konsistenz Acquire-Release-Semantik Synchronisation zwischen Threads mit atomaren Operationen Relaxed-Semantik Weak Memory Model Schwache Zusicherungen
8 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
9 Atomare Datentypen Atomare Variablen sind die Grundlage für das C++- Speichermodell. Atomare Operationen auf atomare Variablen definieren die Synchronisations- und Ordnungsbedingungen. Synchronisations- und Ordnungsbedingungen gelten für atomare Variablen und nicht atomare Variablen. Synchronisations- und Ordnungsbedingungen werden von höheren Abstraktionen verwendet. Threads Mutexe und Locks Bedingungsvariablen...
10 Atomare Datentypen: std::atomic_flag Das atomare Flag std::atomic_flag bietet ein sehr einfaches Interface an. clear und test_and_set ist die einzige lockfreie Datenstruktur. Alle weiteren atomaren Datentypen für integrale Typen, Zeiger und eigene Datentypen können intern Locks verwenden. ist der elementarer Baustein für höhere Abstraktionen. Spinlock
11 Atomare Datentypen: std::atomic_flag Spinlock Locken einer Ressource class Spinlock{ std::atomic_flag flag; public: Spinlock():flag(ATOMIC_FLAG_INIT){ void lock(){ while(flag.test_and_set()); void unlock(){ flag.clear(); ; Spinlock spin; // Mutex spin; void workonresource(){ spin.lock(); sleep_for(seconds(2)); spin.unlock(); int main({ thread t(workonresource); thread t2(workonresource); t.join(); t2.join();
12 Atomare Datentypen: std::atomic_flag Spinlock Mutex
13 Atomare Datentypen: std::atomic<bool> Der atomare Wahrheitswert std::atomic<bool> lässt sich explizit auf true oder false setzen. unterstützt die Funktion compare_exchange_strong. Fundamentale Funktion für atomare Operationen. Vergleicht und setzt einen Wert in einer atomaren Operation. Syntax: bool compare_exchange_strong(expected, desired) Strategie: atom.compare_exchange_strong(exp,des) *atom == exp *atom!= exp *atom= des exp= *atom lässt sich als Bedingungsvariable verwenden.
14 Atomare Datentypen: Bedingungsvariable std::vector<int> mysharedwork; std::mutex mutex_; std::condition_variable condvar; bool dataready; void setdataready(){ mysharedwork={1,0,3; { lock_guard<mutex> lck(mutex_); dataready=true; condvar.notify_one(); void waitingforwork(){ unique_lock<mutex> lck(mutex_); condvar.wait(lck,[]{return dataready;); mysharedwork[1]= 2; int main(){ thread t1(waitingforwork); thread t2(setdataready); t1.join(); t2.join(); for (auto v: mysharedwork){ std::cout << v << " "; // 1 2 3
15 Atomare Datentypen: std::atomic<bool> std::vector<int> mysharedwork; std::atomic<bool> dataready(false); void setdataready(){ mysharedwork={1,0,3; dataready= true; void waitingforwork(){ while (!dataready.load()){ sleep_for(milliseconds(5)); mysharedwork[1]= 2; int main(){ thread t1(waitingforwork); thread t2(setdataready); t1.join(); t2.join(); for (auto v: mysharedwork){ cout << v << " "; // happens-before synchronizes-with
16 Atomare Datentypen: std::atomic Alle weiteren atomaren Datentypen sind teilweise oder vollständige Spezialisierungen von std::atomic. std::atomic<t*> std::atomic<integraler Typ> std::atomic<eigener Typ> Für eigene Datentypen gelten Einschränkungen Ihr Copy-Zuweisungsoperator und alle ihre Basisklassen müssen trivial sein. Sie dürfen keine virtuellen Methoden und Basisklassen enthalten. Sie müssen bitweise vergleichbar sein.
17 Atomare Datentypen: std::atomic! Es gibt keine Multiplikation oder Division.
18 Atomare Datentypen: std::atomic template <typename T> T fetch_mult(std::atomic<t>& shared, T mult){ T oldvalue= shared.load(); shared.compare_exchange_strong(oldvalue, oldvalue * mult); return oldvalue; int main(){ std::atomic<int> myint{5; std::cout << myint << std::endl; fetch_mult(myint,5); std::cout << myint << std::endl;
19 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
20 Synchronisations- und Ordnungsbedingungen C++ kennt sechs verschiedene Speichermodelle. enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst ; Per Default gilt die Sequenzielle Konsistenz. Das Speichermodell für C# und Java. memory_order_seq_cst Implizites Argument bei atomaren Operationen std::atomic<int> shared; shared.load() shared.load(std::memory_order_seq_cst);
21 Synchronisations- und Ordnungsbedingungen Ordnung in das Speichermodell bringt die Beantwortung zweier Fragen. 1. Für welche atomaren Operationen sind die Speichermodelle konzipiert? 2. Welche Synchronisations- und Ordnungsbedingungen definieren die Speichermodelle?
22 Synchronisations- und Ordnungsbedingungen 1. Für welche atomaren Operationen sind die Speichermodelle konzipiert?! Ordnungsbedingungen. read-operationen: memory_order_acquire und memory_order_consume write-operationen: memory_order_release read-modify-write-operationen: memory_order_acq_rel und memory_order_seq_cst memory_order_relaxed definiert keine Synchronisations- und
23 Synchronisations- und Ordnungsbedingungen std::atomic<int> atom; atom.load(std::memory_order_acq_rel) atom.load(std::memory_order_release) atom.load(std::memory_order_acquire) atom.load(std::memory_order_relaxed)
24 Synchronisations- und Ordnungsbedingungen 2. Welche Synchronisations- und Ordnungsbedingungen definieren die Speichermodelle? Sequenzielle Konsistenz Globale Ordnung auf allen Threads memory_order_seq_cst Acquire-Release-Sematik Ordnung zwischen Lese- und Schreibeoperationen der gleichen atomaren Variablen auf verschiedenen Threads memory_order_consume, memory_order_acquire, memory_order_release und memory_order_acq_rel Relaxed-Semantik Keine Synchronisations- oder Ordnungsbedingungen memory_order_relaxed
25 Synchronisations- und Ordnungsbedingungen Sequenzielle Konsistenz (Leslie Lamport 1979) 1. Die Anweisungen eines Programms werden in der Sourcecodereihenfolge ausgeführt. 2. Es gibt eine globale Reihenfolge aller Operationen auf allen Threads. Sequenzielle Konsistenz ergibt 1. Die Befehle werde in der Reihenfolge ausgeführt, in der sie im Sourcecode stehen. 2. Jeder Thread sieht die Operationen jedes anderen Threads in der gleichen Reihenfolge (globaler Zeittakt).
26 Synchronisations- und Ordnungsbedingungen mögliche Ausführungsreihenfolgen
27 Synchronisations- und Ordnungsbedingungen Acquire-Release-Semantik Eine release-operation auf einer atomaren Variable synchronisiert sich mit einer acquire-operation auf der gleichen atomaren Variablen und definiert eine Ordnungsbedingung. Acquire-Operation: Lese-Operation (load oder auch test_and_set) Release-Operation: Schreibe-Operation(store oder auch clear) Ordnungsbedingungen: Lese- und Schreiboperationen können nicht vor eine acquire- Operation verschoben werden Lese- und Schreiboperationen können nicht hinter eine release- Operation verschoben werden
28 Synchronisations- und Ordnungsbedingungen Thread 1 Thread 2 Thread 3
29 Synchronisations- und Ordnungsbedingungen Acquire-Operationen Locken eines Mutex Warten einer Bedingungsvariable Starten eines Threads Release-Operationen Unlocken eines Mutex Benachrichtigung einer Bedingungsvariable join-aufruf auf einem Thread
30 Synchronisations- und Ordnungsbedingungen class Spinlock{ std::atomic_flag flag; public: Spinlock(): flag(atomic_flag_init) { void lock(){ while(flag.test_and_set(std::memory_order_acquire)); void unlock(){ flag.clear(std::memory_order_release); ;
31 Synchronisations- und Ordnungsbedingungen Consume-Release-Semantik Consume-Release-Semantik ist die Acquire-Release-Semantik ohne Ordnungsbedingungen. Besitzt einen legendären Ruf Sehr verständnisrersistent std::memory_order_consume wird durch den Compiler auf std::memory_order_acquire abgebildet Kein Compiler implementiert sie (Ausnahme GCC) Beschäftigt sich mit Datenabhängigkeiten In einem Thread: carries-a-dependency-to Zwischen Threads: dependency-ordered-before
32 Synchronisations- und Ordnungsbedingungen atomic<string*> ptr; int data; atomic<int> atodata; atomic<string*> ptr, int data; atomic<int> atodata; void producer(){ string* p = new string("c++11"); data = 2011; atodata.store(14,memory_order_relaxed); ptr.store(p,memory_order_release); void producer(){ string* p = new string("c++11"); data = 2011; atodata.store(14,memory_order_relaxed); ptr.store(p, memory_order_release); void consumer(){ string* p2; while (!(p2 = ptr.load(memory_order_acquire))); cout << *p2 << " " << data; cout << atodata.load(memory_order_relaxed); void consumer(){ string* p2; while (!(p2 = ptr.load(memory_order_consume))); cout << *p2 << " " << data; cout << atodata.load(memory_order_relaxed);
33 Synchronisations- und Ordnungsbedingungen
34 Synchronisations- und Ordnungsbedingungen Relaxed Semantik Es gelten keine Synchronisations- und Ordnungsbedingungen. Nur die Atomizität der atomaren Operationen ist gewährleistet. Regeln! anderer Atomare Operationen mit strengeren Speicherordnungen werden verwendet, um atomare Operationen mit Relaxed-Semantik und nicht atomare Operationen zu ordnen. Operationen in einem Thread werden in Sourcecodeorder ausgeführt (sequenced-before). Typische Anwendungsfälle atomare Zähler (shared_ptr) Threads können die Operationen in einem anderen Thread in Reihenfolge wahrnehmen.
35 Synchronisations- und Ordnungsbedingungen std::atomic<int> cnt = {0; void f(){ for (int n = 0; n < 1000; ++n) { cnt.fetch_add(1, std::memory_order_relaxed); int main(){ std::vector<std::thread> v; for (int n = 0; n < 10; ++n){ v.emplace_back(f); for (auto& t : v) { t.join(); std::cout << "Final counter value is " << cnt << '\n';
36 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
37 Singleton mutex mymutex; class MySingleton{ public: static MySingleton& getinstance(){ lock_guard<mutex> mylock(mymutex); if(!instance ) instance= new MySingleton(); return *instance; private: MySingleton(); ~MySingleton(); MySingleton(const MySingleton&)= delete; MySingleton& operator=(const MySingleton&)= delete; static MySingleton* instance; ; MySingleton::MySingleton()= default; MySingleton::~MySingleton()= default; MySingleton* MySingleton::instance= nullptr;... MySingleton::getInstance(); Performanzproblem
38 Singleton: Sequenzielle Konsistenz class MySingleton{ public: static MySingleton* getinstance(){ MySingleton* sin= instance.load(); if (!sin ){ std::lock_guard<std::mutex> mylock(mymutex); sin= instance.load(std::memory_order_relaxed); if(!sin ){ sin= new MySingleton(); instance.store(sin); return sin; private: static std::atomic<mysingleton*> instance; static std::mutex mymutex;...
39 Singleton: Acquire-Release-Semantik class MySingleton{ public: static MySingleton* getinstance(){ MySingleton* sin= instance.load(std::memory_order_acquire); if (!sin ){ std::lock_guard<std::mutex> mylock(mymutex); sin= instance.load(std::memory_order_relaxed); if(!sin ){ sin= new MySingleton(); instance.store(sin,std::memory_order_release); return sin;...
40 Singleton: Meyers Singleton class MySingleton{ public: static MySingleton& getinstance(){ static MySingleton instance; return instance; private: MySingleton()= default; ~MySingleton()= default; MySingleton(const MySingleton&)= delete; MySingleton& operator=(const MySingleton&)= delete; ;! Setzt Microsoft Visual Studio 2015 voraus.
41 Singleton Performanzvergleich: Je vier Thread greifen 10'000'000 Mal auf ein Singleton zu Mein PC besitzt 4 Kerne Auf Linux mit maximaler Optimierung std::lock_guard (Mutex) Sequenzielle Konsistenz Acquire-Release- Semantik Meyers Singleton Die Details: Vergleich Single-Threaded versus Multithreaded Weitere Varianten Windows (cl.exe) versus Linux (GCC) Mit und ohne voller Optimierung Threadsicheres Initialisieren eines Singleton
42 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
43 Probleme? int x= 0; int y= 0; void writing(){ x= 2000; y= 11; void reading(){ cout << "y: " << y << " "; cout << "x: " << x << endl; y x Yes int main(){ thread thread1(writing); thread thread2(reading); thread1.join(); thread2.join(); ;
44 Mutex int x= 0; int y= 0; mutex mut; void writing(){ lock_guard<mutex> guard(mut); x= 2000; y= 11; y x Yes void reading(){ lock_guard<mutex> guard(mut) cout << "y: " << y << " "; cout << "x: " << x << endl;... thread thread1(writing); thread thread2(reading);
45 Probleme? volatile x= 0; volatile y= 0; void writing(){ x= 2000; y= 11; void reading(){ cout << y << " "; cout << x << endl; y x Yes thread thread1(writing); thread thread2(reading);
46 Java versus C++ Java volatile == C++ atomic std::atomic Schutz der Daten vor gemeinsamen Zugriff mehrerer Threads volatile Zugriff auf speziellen Speicher, auf dem Lesen und Schreiben nicht optimiert werden darf
47 Atomare Variablen atomic<int> x= 0; atomic<int> y= 0; void writing(){ x.store(2000); y.store(11); void reading(){ cout << y.load() << " "; cout << x.load() << endl; y x Yes thread thread1(writing); thread thread2(reading);
48 Acquire-Release Semantik atomic<int> x= 0; atomic<int> y= 0; void writing(){ x.store(2000,memory_order_relaxed); y.store(11, memory_order_release); y x Yes void reading(){ cout << y.load(memory_order_acquire) << " "; cout << x.load(memory_order_relaxed) << endl;... thread thread1(writing); thread thread2(reading);
49 Nicht atomare Variablen int x= 0; atomic<int> y= 0; void writing(){ x= 2000; y.store(11, memory_order_release); void reading(){ cout << y.load(memory_order_acquire) << " "; cout << x << endl;... thread thread1(writing); thread thread2(reading); y x Yes
50 Relaxed Semantik atomic<int> x= 0; atomic<int> y= 0; void writing(){ x.store(2000,memory_order_relaxed); y.store(11, memory_order_relaxed); void reading(){ cout << y.load(memory_order_relaxed) << " "; cout << x.load(memory_order_relaxed) << endl;... thread thread1(writing); thread thread2(reading); y x Yes
51 Die Lösung: CppMem CppMem
52 Das C++-Speichermodell Der Vertrag Atomare Datentypen Synchronisations- und Ordnungsbedingungen Singleton Pattern Sukzessive Optimierung
53 Das C++-Speichermodell Mehr Optimierungspotential für das System Anzahl der möglichen Kontrollflüsse steigt exponentiell Zunehmend ein ausschließliches Gebiet für Domänexperten Bruch der natürlichen Intuition Feld für Mikrooptimierung
54 Weitere Informationen Modernes C++: Schulungen, Coaching und Technologieberatung durch Rainer Grimm Blog zu Modernem C++
55 Rainer Grimm Schulungen, Coaching und Technologieberatung
Multi-Threading wie in C++11
Multi-Threading wie in C++11 Franco Chiappori Embedded Computing Conference 2013 Reiseroute Guards Lock-Free Data Structures Futures Promises Atomic Types Memory Barriers Compiler / Prozessor Compiler
DAP2-Programmierpraktikum Einführung in C++ (Teil 2)
DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und
Operating Systems Principles C11
Humboldt University Computer Science Department Operating Systems Principles C11 Lab 0 - Auswertung Make Das Unix-Tool make bietet die Möglichkeit mehrere, voneinander unabhängige Jobs (z.b. das Übersetzen
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Tafelübung 04 Referenzen, Overloading, Klassen(hierarchien) Clemens Lang T2 18. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/13 Organisatorisches Nächster Übungstermin
Java Concurrency Utilities
Java Concurrency Utilities Java unterstützt seit Java 1.0 Multithreading Java unterstützt das Monitorkonzept mittels der Schlüsselworte synchronized und volatile sowie den java.lang.object Methoden wait(),
Effizientes Memory Debugging in C/C++
Effizientes Memory Debugging in C/C++ Adam Szalkowski Embedded Computing Conference 2014 Ursachen/ Symptome Debugging Tools Ursachen / Symptome Was habe ich falsch gemacht? Was kann denn passieren im schlimmsten
Universität Karlsruhe (TH)
Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 Das Java-Speichermodell Prof. Dr. Walter F. Tichy Dr. Victor Pankratius Ali Jannesari Geschichte des Speichermodells Kapitel 17 der Java-Sprachdefinition
Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren
Dynamische Datentypen Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen Probleme mit
Übung zu Grundlagen der Betriebssysteme. 10. Übung 18.12.2012
Übung zu Grundlagen der Betriebssysteme 10. Übung 18.12.2012 Aufgabe 1 a) Was versteht man unter einem kritischen Abschnitt oder kritischen Gebiet (critical area)? b) Welche Aufgabe hat ein Semaphor? c)
Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen
Prof. Dr. Wolfgang Schramm Vorlesung Exkurs: Anonyme Klassen Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm Vorlesung Exkurs: Anonyme Klassen Techniken der Programmentwicklung Anonyme Klassen
Gegenseitiger Ausschluss 102
Gegenseitiger Ausschluss 102 MX = M (P 1... P n ) M = (lock unlock M) P i = (lock begin_critical_region i end_critical_region i unlock private_work i P i ) n Prozesse P 1... P n wollen konkurrierend auf
Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke
Java 2 Markus Reschke 07.10.2014 Datentypen Was wird gespeichert? Wie wird es gespeichert? Was kann man mit Werten eines Datentyps machen (Operationen, Methoden)? Welche Werte gehören zum Datentyp? Wie
C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89
C++11 - Seminar Dr.sc.nat. Michael J.M. Wagner, New Elements Revision 89 Inhaltsverzeichnis 1 Tour de C++ 11 1 1.1 Standards und Ziele................................ 1 1.2 Kernsprache....................................
OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik
Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Test-Besprechung! Ziele verdeutlichen Große Bild von OOP Wiederholung: Einbettung als Technik
Einführung in die Programmierung
: Inhalt Einführung in die Programmierung Wintersemester 2010/11 Lokale und globale Variablen Namensräume Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund
Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften
Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder
C++ Parent-Shared-Ptr. Detlef Wilkening
http://www.wilkening-online.de Seite 1 / 19 C++ Parent-Shared-Ptr Detlef Wilkening 14.01.2016 http://www.wilkening-online.de Seite 2 / 19 Shared-Ptr Kennt jeder Nutzt jeder Und das ist gut so Aber es gibt
Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter
Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener
Verteilte Systeme CS5001
Verteilte Systeme CS5001 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Client-Server-Anwendungen: Vom passiven (shared state) Monitor zum aktiven Monitor Monitor (Hoare, Brinch-Hansen,
Einführung in die Programmierung Wintersemester 2016/17
Einführung in die Programmierung Wintersemester 2016/17 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund : Gültigkeitsbereiche Inhalt Lokale und globale
Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm
Exkurs: ANONYME KLASSEN Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm Anonyme Klassen Eigenschaften 1 Häufigste Anwendung lokaler Klassen: anonyme Definition. Klasse erhält keinen eigenen
Themen. Formatierte und unformatierte Eingabe Bedingungsoperator Namespaces Kommandozeilenargumente
Themen Formatierte und unformatierte Eingabe Bedingungsoperator Namespaces Kommandozeilenargumente Formatierte Eingabe mit cin Die Formatierung der Eingabe ist der Ausgabe sehr ähnlich: Die Flags werden
Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen
Lambda-Funktionen Lambda-Funktionen sind Funktionen ohne Namen. definieren ihre Funktionalität an Ort und Stelle. können wie Daten kopiert werden. können ihren Aufrufkontext speichern. Lambda-Funktionen
Grundlagen von C# - 1
Grundlagen von C# - 1 Marc Satkowski 20. November 2016 C# Kurs Gliederung 1. Über diesen Kurs 2. Benötigte Software 3. Exkurs: Architektur von.net und C# 4. Erstes Programm: Hello World Grundlegende Eigenschaften
Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes
Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine
Einstieg in die Informatik mit Java
1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren
Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only
Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer
1. Übung zu "Numerik partieller Differentialgleichungen"
1. Übung zu "Numerik partieller Differentialgleichungen" Simon Gawlok, Eva Treiber Engineering Mathematics and Computing Lab 22. Oktober 2014 1 / 15 1 Organisatorisches 2 3 4 2 / 15 Organisatorisches Ort:
Ausnahmebehandlung in Java
Ausnahmebehandlung in Java class A { void foo() throws Help, SyntaxError {... class B extends A { void foo() throws Help { if (helpneeded()) throw new Help();... try {... catch (Help e) {... catch (Exception
THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic
THE GO PROGRAMMING LANGUAGE Part 1: Michael Karnutsch & Marko Sulejic Gliederung Geschichte / Motivation Compiler Formatierung, Semikolons Variablen, eigene Typen Kontrollstrukturen Funktionen, Methoden
Visuelle Kryptographie. Anwendung von Zufallszahlen
Visuelle Kryptographie Anwendung von Zufallszahlen Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken, so dass Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken,
PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes
PThreads Prozesse und Threads Ein Unix-Prozess hat IDs (process,user,group) Umgebungsvariablen Verzeichnis Programmcode Register, Stack, Heap Dateideskriptoren, Signale message queues, pipes, shared memory
C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14
C++ Teil 10 Sven Groß IGPM, RWTH Aachen 17. Dez 2014 Sven Groß (IGPM, RWTH Aachen) C++ Teil 10 17. Dez 2014 1 / 14 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente
Funktionale Programmierung mit modernem C++ Rainer Grimm Schulungen, Coaching und Technologieberatung
Funktionale Programmierung mit modernem C++ Rainer Grimm Schulungen, Coaching und Technologieberatung Funktionale Programmierung in modernem C++ Funktional in C++ Warum Funktional? Definition Charakteristiken
Algorithmen und Datenstrukturen II
Algorithmen und Datenstrukturen II in JAVA D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2009, 31. März 2009, c 2009 D.Rösner
Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen
Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18
C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17
C++ Teil 9 Sven Groß 17. Juni 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 9 17. Juni 2016 1 / 17 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente Methoden / Elementfunktionen
Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen
Thread-Synchronisation in in Java Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen Die Klasse Thread Die Die Klasse Thread gehört zur zur Standardbibliothek von von
Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.
Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 23.5.07 G. Bohlender (IANM UNI Karlsruhe) Vererbung 23.5.07 1 / 22 Übersicht 1
Grundlagen der Informatik 12. Strukturen
12. Strukturen Strukturen und deren Komponenten Strukturen im Projekt Dynamisch erstellte Strukturen Strukturen und Operatoren Strukturen und Funktionen Einfach verkettete Liste Grundlagen der Informatik
Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2
Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2 Neben vector ist list die zweite wichtige Containerklasse. Um unsere Kenntnisse von Containerklassen zu erweitern,
Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)
Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester
Objektorientierte Programmierung
C++ Objektorientierte Programmierung Erweiterung von selbstdefinierten Datentypen (struct) zu Klasse. Eine Klasse besteht dann aus - Attributen (Untertypen wie struct) und zusätzlich - aus Methoden (Funktionen
Rechnerarchitektur SS 2012
Rechnerarchitektur SS 2012 Speicherkonsistenz Michael Engel TU Dortmund, Fakultät für Informatik Teilweise basierend auf Material von Gernot A. Fink und R. Yahyapour 13. Juni 2013 Speicherkonsistenz Kohärenz
2.2 Prozesse in Java
2.2 Prozesse in Java! Java sieht kein Schlüsselwort für Prozesse vor, sondern bestimmte Klassen und Schnittstellen. Mit anderen Worten: der Prozessbegriff wird mit Mitteln der Objektorientierung eingeführt.
Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29
Kapitel 2 Einführung in C++ Seite 1 von 29 C++ Zeichensatz - Buchstaben: a bis z und A bis Z. - Ziffern: 0 bis 9 - Sonderzeichen: ; :,. # + - * / % _ \! < > & ^ ~ ( ) { } [ ]? Seite 2 von 29 Höhere Elemente
Programmieren in C++ Templates
Programmieren in C++ Templates Inhalt Templates Funktions- und Klassen-Templates Spezialisierung von Templates Generische Klassen Einbinden von Templates Instantiierung (implizit und explizit) Templates
Praxisorientierte Einführung in C++ Lektion: "Static Members"
Praxisorientierte Einführung in C++ Lektion: "Static Members" Christof Elbrechter Neuroinformatics Group, CITEC May 28, 2014 Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 1 / 11
Implementieren von Klassen
Implementieren von Klassen Felder, Methoden, Konstanten Dr. Beatrice Amrhein Überblick Felder/Mitglieder (Field, Member, Member-Variable) o Modifizierer Konstanten Methoden o Modifizierer 2 Felder und
Info B VL 11: Innere Klassen/Collections
Info B VL 11: Innere Klassen/Collections Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück Info B VL 11: Innere Klassen/Collections
Einführung in C ++ und die Objektorientierte Programierung
1/38 Einführung in C ++ und die Objektorientierte Programierung Florian Adamsky, B. Sc. (PhD cand.) florian.adamsky@iem.thm.de http://florian.adamsky.it/ cbd Softwareentwicklung im WS 2014/15 2/38 Outline
Java vs. C++: Different by Design
Java vs. C++: Different by Design Java starke Anlehnung an C++ Deployment Schema: Interpretation OO ist (nahezu) zwingend primäres Kriterium: Komfort diverse (und zumeist nicht abschaltbare) implizite
Tutorium Rechnerorganisation
Woche 2 Tutorien 3 und 4 zur Vorlesung Rechnerorganisation 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu
JJ Prozesse und Nebenläufigkeit
1 Wiederholung: Algorithmus von Peterson boolean ready0=false, ready1=false; int turn=0; JJ Prozesse und Nebenläufigkeit (Auszug aus der Vorlesung) while( 1 ) Prozess 0 ready0 = true; turn = 1; while(
1.4. Funktionen. Objektorientierte Programmierung mit C++
mehrfache Deklarationen sind erlaubt für jede Funktion muss es (GENAU) eine Definition geben, ansonsten linker error [the one definition rule ODR] Deklarationen in *.h - Files, Definitionen in *.cpp -
Prozesse und Threads. wissen leben WWU Münster
Münster Multi Threading in C++ 1 /19 Prozesse und Threads Ein Unix-Prozess hat IDs (process,user,group) Umgebungsvariablen Verzeichnis Programmcode Register, Stack, Heap Dateideskriptoren, Signale message
Entwurfsmuster und Frameworks Singleton
Entwurfsmuster und Frameworks Singleton Oliver Haase Oliver Haase Emfra Singleton 1/20 Beschreibung I Klassifikation: objektbasiertes Erzeugungsmuster Zweck: sicherstellen, dass eine Klasse nur genau einmal
Tag 8 Repetitorium Informatik (Java)
Tag 8 Repetitorium Informatik (Java) Dozent: Michael Baer Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2017/2018 Informatik-Repetitorium
Vererbung, Polymorphie
Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08
Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel
4213 Variablen 17.834 float Flugzeug 36812736294 I write code Hund long String Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 3 + 4 1 Variablen sind wie Becher. Sie speichern etwas. // Variablen
JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)
JAVA BASICS 2. Primitive Datentypen 1. Warum Java? weit verbreitet einfach und (relativ) sicher keine Pointer (?) keine gotos kein Präprozessor keine globalen Variablen garbage collection objekt-orientiert
Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015
Java Crashkurs Kim-Manuel Klein (kmk@informatik.uni-kiel.de) May 4, 2015 Quellen und Editoren Internet Tutorial: z.b. http://www.java-tutorial.org Editoren Normaler Texteditor (Gedit, Scite oder ähnliche)
Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik
Klassen und höhere Datentypen Objekte, Felder, Methoden Küchlin/Weber: Einführung in die Informatik Klassen Klasse (class) stellt einen (i.a. benutzerdefinierten) Verbund-Datentyp dar Objekte sind Instanzen
public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test
Manche Funktionen, deren Ergebnistyp void ist, geben gar keine Werte zurück im Beispiel: write() und main(). Diese Funktionen heißen Prozeduren. Das Hauptprogramm hat immer als Parameter ein Feld args
Einführung in die Programmierung mit C++
1 Seite 1 Einführung in die Programmierung mit C++ Teil III - Objektorientierte Programmierung 10. Vererbung und Polymorphie Vererbung und Polymorphie in C++ Seite 2 Klassen können von anderen Klassen
Nebenläufige Programme mit Python
Nebenläufige Programme mit Python PyCon DE 2012 Stefan Schwarzer, SSchwarzer.com info@sschwarzer.com Leipzig, Deutschland, 2012-10-30 Nebenläufige Programme mit Python Stefan Schwarzer, info@sschwarzer.com
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte
Einführung Verteilte Systeme - Java Threads I -
Einführung Verteilte Systeme - Java Threads I - Prof. Dr. Michael Cebulla 20. November 2014 Fachhochschule Schmalkalden Wintersemester 2014/15 1 / 38 M. Cebulla Verteilte Systeme Gliederung Wiederholung:
Threading. Arthur Zaczek. Aug 2015
Arthur Zaczek Aug 2015 1 Threading 1.1 Motivation Threading erlaubt die gleichzeitige Ausführung von mehreren Programmteilen. mehrere gleichzeitige Anfragen: Webserver, Datenbank (zu) lange laufende Berechnungen:
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)
Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl
Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.
Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende
Programmieren in C++ Überladen von Methoden und Operatoren
Programmieren in C++ Überladen von Methoden und Operatoren Inhalt Überladen von Methoden Überladen von Operatoren Implizite und explizite Konvertierungsoperatoren 7-2 Überladen von Methoden Signatur einer
Einstieg in die Informatik mit Java
1 / 27 Einstieg in die Informatik mit Java Klassen als Datenstrukturen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 27 1 Überblick: Klassen als Datenstruktur 2 Vereinbarung
Unterlagen. CPP-Uebungen-08/
Unterlagen http://projects.eml.org/bcb/people/ralph/ CPP-Uebungen-08/ http://www.katjawegner.de/lectures.html Kommentare in C++ #include /* Dies ist ein langer Kommentar, der über zwei Zeilen
Threads und Shared Variables in C++11 Memory Model. Kevin Funk Freie Universität Berlin
Threads und Shared Variables in C++11 Memory Model Kevin Funk Freie Universität Berlin Seminar Programmiersprachen 2012 Inhalt Motivation Einleitung Basics Nebenläufigkeit (Concurrency) Nebenläufigkeit
Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden
Einleitende Bemerkungen Einleitende Bemerkungen Aspekte Aufbau von sinnvollen Klassenhierarchien Verwaltung von Objekten unterschiedlichen Typs Mitarbeiter Besonderheiten der Anwendung jeder Angehörige
C++ vs. Java. Hello world! Java C++ class HelloWorld { static public void main(string args) { System.out.println("Hello World!
Hello world! Java class HelloWorld { static public void main(string args) { System.out.println("Hello World!"); } } C #include main() { printf("hello World!\n"); } C++ #include using
1 Klassen und Objekte
1 Klassen und Objekte Datentyp - Spezifikation des Typs von Datenobjekten Datenstruktur - logische Ordnung von Elementen eines Datentyps - zur (effizienten) Speicherung, Verwaltung, Zugriff - auf die Elemente
12 Abstrakte Klassen, finale Klassen und Interfaces
12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,
C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11
C++ Teil 12 Sven Groß 18. Jan 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 12 18. Jan 2016 1 / 11 Themen der letzten Vorlesung Wiederholung aller bisherigen Themen: Datentypen und Variablen Operatoren Kontrollstrukturen
RO-Tutorien 15 und 16
Tutorien zur Vorlesung Rechnerorganisation Tutorienwoche 2 am 04.05.2011 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft
Objektorientierte Programmierung Studiengang Medieninformatik
Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 5 12.04.2017 Was bisher geschah... Objektorientierte Programmierung Klassen und Objekte, Attribute
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 7. Funktionen Einleitung Nach dem Prinzip Divide and Conquer bietet es sich an, größere Aufgaben in kleinere Teile zu unterteilen. Anweisungsblöcke,
Betriebssysteme G: Parallele Prozesse ( Teil C: SpinLock, Semaphore, Monitore)
Betriebssysteme G: Parallele Prozesse ( Teil C: SpinLock, Semaphore, Monitore) 1 Hardwareunterstützung Uniprozessor-System Verbiete Interrupts während des Aufenthalts in einer CR disable interrupt CR(bzw:
II.4.2 Abstrakte Klassen und Interfaces - 1 -
1. Unterklassen und Vererbung 2. Abstrakte Klassen und Interfaces 3. Modularität und Pakete 4. Ausnahmen (Exceptions) 5. Generische Datentypen 6. Collections II.4.2 Abstrakte Klassen und Interfaces - 1
Einstieg in die Informatik mit Java
Vorlesung vom 18.4.07, Vordefinierte Datentypen Übersicht 1 Ganzzahlige Typen 2 Boolscher Typ 3 Gleitkommatypen 4 Referenztypen 5 void Typ 6 Implizite und explizite Typumwandlungen Ganzzahlige Typen Die
Vererbung & Schnittstellen in C#
Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung
Theorie zu Übung 8 Implementierung in Java
Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept
Objektorientierte Sprachen
Objektorientierte Sprachen Eine Sprache, die Objekte unterstützt, heißt objektbasiert Eine klassenbasierte Sprache unterstützt zusätzlich Klassen Eine objektorientierte Sprache unterstützt zusätzlich die
2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
19. Vererbung und Polymorphie
667 19. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6
Erzeugungsmuster. Kapselung der Objekt-Erzeugung
Erzeugungsmuster Kapselung der Objekt-Erzeugung Definition Erzeugungsmuster dienen für die Lose Koppelung, bei der erst zur Laufzeit der Typ des zu erzeugenden Objekts festgelegt wird. Abstract Factory
C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22
C++ Teil 2 Sven Groß IGPM, RWTH Aachen 16. Apr 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 2 16. Apr 2015 1 / 22 Themen der letzten Vorlesung Hallo Welt Elementare Datentypen Ein-/Ausgabe Operatoren Sven
2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
Repetitorium Informatik (Java)
Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen
JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)
JAVA BASICS 2. Primitive Datentypen 1. Warum Java? zunehmend weit verbreitet einfach und (relativ) sicher keine Adressrechnung, aber Pointer keine gotos kein Präprozessor keine globalen Variablen garbage
Coding Conventions. for C++ Reto Carrara Gyrenstrasse 17 CH-8967 Widen +4179/
Coding Conventions for C++ Reto Carrara Gyrenstrasse 17 CH-8967 Widen +4179/328 17 05 www.carrara.ch info@carrara.ch Inhalt Inhalt...2 Revision...3 Einführung...4 Klassen- und Struct-Namen...5 Makros...6
Ausdrücke der Programmiersprache Java
Ausdrücke der Programmiersprache Java Hamburg 1 Ablauf des Vortrags 01. Eigenschaften von Ausdrücken 02. Arithmetische Operatoren 03. Relationale Operatoren 04. Logische Operatoren 05. Bitweise Operatoren
kurze Wiederholung class templates
kurze Wiederholung class templates Ein class template ist ein Template, dass mit einem oder mehreren typename -Parametern implementiert wird. Um solch ein Template zu benutzen, übergibt man dem Template
RO-Tutorien 17 und 18
RO-Tutorien 17 und 18 Tutorien zur Vorlesung Rechnerorganisation Christian A. Mandery TUTORIENWOCHE 2 AM 10.05.2012 KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der