Effektives modernes C++ (eBook)
320 Seiten
O'Reilly Verlag
978-3-95875-050-0 (ISBN)
Effektives modernes C++ 3
Inhalt 5
Danksagung 11
Kapitel – Einleitung 15
Begriffe und Konventionen 16
Fehler und Verbesserungsvorschläge 20
Verwendung der Codebeispiele 21
Kontakt 21
Kapitel 1 – Typen ableiten 23
Technik 1: Typableitung beim Template 23
Fall 1: ParamType ist eine Referenz oder ein Zeiger, aber keine universelle Referenz 25
Fall 2: ParamType ist eine universelle Referenz 26
Fall 3: ParamType ist weder ein Zeiger noch eine Referenz 27
Array-Argumente 28
Funktionsargumente 30
Technik 2: Die auto-Typableitung verstehen 31
Technik 3: Verstehen Sie decltype 36
Technik 4: Zeigen Sie abgeleitete Typen an 42
IDE-Editoren 42
Compiler-Diagnose 43
Ausgabe zur Laufzeit 43
Kapitel 2 – auto 49
Technik 5: Ziehen Sie auto einer expliziten Typdeklaration vor 49
Technik 6: Nutzen Sie explizit typisierte Initializer, wenn auto unerwünschte Typen ableitet 54
Kapitel 3 – Der Wechsel zu modernem C++ 61
Technik 7: Der Unterschied zwischen () und {} beim Erstellen von Objekten 61
Technik 8: Nutzen Sie nullptr statt 0 oder NULL 69
Technik 9: Nutzen Sie Alias-Deklarationen statt typedefs 73
Technik 10: Nutzen Sie enums mit Gültigkeitsbereich 77
Technik 11: Nutzen Sie gelöschte statt private, undefinierte Funktionen 83
Technik 12: Deklarieren Sie überschreibende Funktionen per override 88
Technik 13: Nutzen Sie const_iterator statt iterator 94
Technik 14: Deklarieren Sie Funktionen als noexcept, wenn sie keine Exceptions auslösen werden 97
Technik 15: Verwenden Sie nach Möglichkeit immer constexpr 104
Technik 16: Machen Sie const-Member-Funktionen Thread-sicher 110
Technik 17: Verstehen Sie, wie spezielle Member-Funktionen generiert werden 115
Kapitel 4 – Smart Pointer 123
Technik 18: Verwenden Sie std::unique_ptr zum Verwalten exklusiver Ressourcen 124
Technik 19: Verwenden Sie std::shared_ptr für das Verwalten von gemeinsam genutzten Ressourcen 130
Technik 20: Verwenden Sie std::weak_ptr für std::shared_ptr-artige Zeiger, die hängen können 139
Technik 21: Verwenden Sie std::make_unique und std::make_shared statt new 144
Technik 22: Definieren Sie spezielle Member-Funktionen in der Implementierungsdatei, wenn Sie das Pimpl-Idiom verwenden 152
Kapitel 5 – Rvalue-Referenzen, Move-Semantik und Perfect Forwarding 161
Technik 23: Verstehen Sie std::move und std::forward 162
Technik 24: Unterscheiden Sie zwischen universellen Referenzen und Rvalue-Referenzen 167
Technik 25: Verwenden Sie std::move bei Rvalue-Referenzen und std::forward bei universellen Referenzen 171
Technik 26: Vermeiden Sie das Überladen mit universellen Referenzen 179
Technik 27: Machen Sie sich mit Alternativen zum Überladen mit universellen Referenzen vertraut 186
Kein Überladen mehr 186
Übergabe als const T& amp
Übergabe By-Value 186
Tag Dispatching 187
Templates mit universellen Referenzen einschränken 190
Abwägungen 196
Technik 28: Verstehen Sie das Reference Collapsing 198
Technik 29: Gehen Sie davon aus, dass Move-Operationen nicht vorhanden, nicht günstig oder nicht einsetzbar sind 203
Technik 30: Machen Sie sich mit den Problemfällen beim Perfect Forwarding vertraut 207
Braced Initializers 208
0 oder NULL als Null-Zeiger 210
Rein deklarierte ganzzahlige static const-Attribute 210
Überladene Funktions- und Template-Namen 211
Bitfelder 213
Ergebnis 214
Kapitel 6 – Lambda-Ausdrücke 215
Technik 31: Vermeiden Sie Standard-Capture-Modi 216
Technik 32: Nutzen Sie ein Init Capture, um Objekte in Closures zu verschieben 223
Technik 33: Nutzen Sie decltype für auto& amp
Technik 34: Nutzen Sie Lambdas statt std::bind 231
Kapitel 7 – Die Concurrency-API 239
Technik 35: Programmieren Sie Task-basiert statt Thread-basiert 239
Technik 36: Geben Sie std::launch::async an, wenn Asynchronität entscheidend ist 243
Technik 37: Sorgen Sie dafür, dass std::threads auf allen Ablaufpfaden nicht zusammenführbar sind 247
Technik 38: Berücksichtigen Sie das unterschiedliche Verhalten beim Zerstören von Thread-Handles 254
Technik 39: Nutzen Sie void-Futures für die einmalige Kommunikation von Ereignissen 259
Technik 40: Verwenden Sie std::atomic in Concurrency-Situationen und volatile für spezielle Speicherbereiche 267
Kapitel 8 – Wertübergabe und Emplacement 275
Technik 41: Erwägen Sie die Wertübergabe bei kopierbaren Parametern, die sich mit wenig Aufwand verschieben lassen und die immer kopiert werden 275
Technik 42: Erwägen Sie den Einsatz von Emplacement statt Einfügen 285
Index 295
Über den Autor 309
Über den Übersetzer 309
Kolophon 309
Danksagung
Ich begann mit meinen Nachforschungen rund um C++0x (das dann zu C++11 werden sollte) im Jahr 2009. In der Usenet-Newsgroup comp.std.c++
stellte ich viele Fragen, und ich bin den Mitgliedern dieser Community (insbesondere Daniel Krügler) für ihre sehr hilfreichen Postings ausgesprochen dankbar. In den letzten Jahren habe ich mich dann eher auf Stack Overflow[1] herumgetrieben, wenn ich Fragen zu C++11 und C++14 hatte, und auch da bin ich der Community genauso für ihre Hilfe dankbar, die mich bei den Details des modernen C++ nicht allein gelassen hat.
2010 habe ich Materialien für einen Kurs zu C++0x vorbereitet (der schließlich als Overview of the New C++[2] von Artima Publishing im Jahr 2010 veröffentlicht wurde). Sowohl diese Materialien als auch mein Wissen profitierten von den Testlesern Stephan T. Lavavej, Bernhard Merkle, Stanley Friesen, Leor Zolman, Hendrik Schober und Anthony Williams. Ohne ihre Hilfe hätte ich mich bestimmt nicht an Effektives Modernes C++ herangewagt. Der englische Titel Effective Modern C++ wurde übrigens von einer Reihe von Lesern vorgeschlagen, als ich am 18. Februar 2014 mein Blog-Posting »Help me name my book«[3] veröffentlichte und Andrei Alexandrescu (Autor von Modern C++ Design[4], Addison-Wesley, 2001) war so freundlich, dem Titel seinen Segen zu geben und nicht darauf zu bestehen, dass dies sein Begriff sei.
Ich kann nicht mehr alle Quellen angeben, auf denen die Informationen in diesem Buch beruhen, aber manche hatten dann doch einen ziemlich direkten Einfluss. Die Verwendung eines nicht definierten Templates in Technik 4, um dem Compiler Typ-Informationen zu entlocken, wurde von Stephan T. Lavavej vorgeschlagen, während mich Matt P. Dziubinski auf Boost.TypeIndex
aufmerksam machte. In Technik 5 stammt das Beispiel mit dem unsigned
-std::vector<int>::size_type
aus Andrey Karpovs Artikel »In what way can C++0x standard help you eliminate 64-bit errors«[5] vom 28. Februar 2010. Das Beispiel rund um std::pair<std::string, int>
/std::pair<const std::string int>
aus der gleichen Technik stammt aus Stephan T. Lavavejs Vortrag »STL11: Magic && Secrets«[6], den er auf der Going Native 2012 gehalten hat. Technik 6 wurde von Herb Sutters Artikel »GotW #94 Solution: AAA Style (Almost Always Auto)«[7] vom 12. August 2013 inspiriert. Die Idee zu Technik 9 stammt von Martinho Fernandes' Blog-Post »Handling dependent names«[8] vom 27. Mai 2012. Das Beispiel aus Technik 12 mit dem Überladen von Referenz-Qualifiern basiert auf Caseys Antwort auf die Frage »Wozu kann man Member-Funktionen von Referenz-Qualifiern überladen?«[9], die am 14. Januar 2014 auf Stack Overflow gestellt wurde. Meine Behandlung der in C++14 erweiterten Unterstützung von constexpr
-Funktionen in Technik 15 greift auf Informationen zurück, die ich von Rein Halbersma erhielt. Technik 16 basiert auf Herb Sutters Präsentation »You don’t know const
and mutable
« von der C++ and Beyond 2012. Der Vorschlag in Technik 18, Fabrikfunktionen einen std::unique_ptr
zurückgeben zu lassen, baut auf Herb Sutters Artikel »GotW# 90 Solution: Factories«[10] vom 30. Mai 2013 auf. In Technik 19 ist fastLoadWidget
von Herb Sutters Präsentation »My Favorite C++ 10-Liner«[11] auf der Going Native 2013 inspiriert. Meine Behandlung von std::unique_ptr
und unvollständigen Typen in Technik 22 nutzt Herb Sutters Artikel »GotW #100: Compilation Firewalls«[12] vom 27. November 2011, aber auch Howard Hinnants Antwort vom 22. Mai 2011 auf die Stack-Overflow-Frage »Muss std::unique_ptr<T> die vollständige Definition von T kennen?«[13]. Das Matrix
-Additions-Beispiel aus Technik 25 basiert auf Texten von David Abrahams. JoeArgonnes Kommentar vom 8. Dezember 2012 zum Blog-Post »Another alternative to lambda move capture«[14] vom 30. November 2012 diente als Quelle für das std::bind
-basierte Vorgehen in Technik 32, um Init Captures in C++11 zu emulieren. Die Erläuterungen in Technik 37 zum Problem mit einem impliziten Detach im Destruktor von std::thread
stammen aus Hans-J. Boehms Artikel »N2802: A plea to reconsider detach-on-destruction for thread objects«[15] vom 4. Dezember 2008. Technik 41 wurde ursprünglich durch eine Diskussion in den Kommentaren zu David Abrahams Blog-Post »Want speed? Pass by value.«[16] vom 15. August 2009 inspiriert. Die Idee, dass Move-Only-Typen eine besondere Behandlung benötigen, stammt von Matthew Fioravante, während die Analyse des zuweisungs-basierten Kopierens auf Kommentaren von Howard Hinnant aufbaut. In Technik 42 haben mir Stephan T. Lavavej und Howard Hinnant dabei geholfen, die relativen Performance-Profile von Emplacement- und Insertion-Funktionen zu verstehen, während mich Michael Winterberg darauf aufmerksam machte, wie ein Emplacement zu Ressourcenlecks führen kann. (Michael bezieht sich dabei auf Sean Parents Präsentation »C++ Seasoning«[17] von der Going Native 2013.) Auch hat er beschrieben, wie Emplacement-Funktionen die direkte Initialisierung nutzen, während Insertion-Funktionen eine Copy-Initialisierung verwenden.
Das Korrekturlesen von Entwürfen eines technisch orientierten Buchs ist eine anspruchsvolle, zeitaufwendige und kritische Aufgabe, und ich bin froh, dass so viele Leute das für mich getan haben. Komplette Versionen oder Teile von Effective Modern C++ wurden von Cassio Neri, Nate Kohl, Gerhard Kreuzer, Leor Zolman, Bart Vandewoestyne, Stephan T. Lavavej, Nevin »:-)« Liber, Rachel Cheng, Rob Stewart, Bob Steagall, Damien Watkins, Bradley E. Needham, Rainer Grimm, Fredrik Winkler, Jonathan Wakely, Herb Sutter, Andrei Alexandrescu, Eric Niebler, Thomas Becker, Roger Orr, Anthony Williams, Michael Winterberg, Benjamin Huchley, Tom Kirby-Green, Alexey A Nikitin, William Dealtry, Hubert Matthews und Tomasz Kamiński offiziell Korrektur gelesen. Zudem erhielt ich Kommentare von vielen Lesern über O’Reilly’s Early Release EBooks[18] und Safari Books Online’s Rough Cuts[19], über Kommentare in meinem Blog (The View from Aristeia[20]) und per E-Mail. Ich bedanke mich bei jedem für seine Hilfe, denn so konnte das Buch viel besser werden. Ich bin insbesondere Stephan T. Lavavej und Rob Stewart zu großem Dank verpflichtet, da mich ihre außerordentlich detaillierten und umfassenden Anmerkungen vermuten lassen, dass sie genauso viel Zeit mit diesem Buch verbracht haben wie ich. Ein besonderer Dank geht zudem an Leor Zolman, der neben dem Lesen des Skripts auch noch alle Codebeispiele doppelt kontrollierte.
Speziell die digitalen Versionen dieses Buchs wurden zur Kontrolle von Gerhard Kreuzer, Emyr Williams und Bradley E. Needham gelesen.
Meine Entscheidung, die Zeilenlänge in den (englischsprachigen) Codebeispielen auf 64 Zeichen zu beschränken (wodurch sich der Code sowohl im Druck als auch auf vielen digitalen Geräten unabhängig von Ausrichtung und Schriftart ordentlich anzeigen lässt), basiert auf Daten von Michael Maher.
Ashley Morgan Williams sorgte dafür, dass das Essen im Lake Oswego Pizzicato immer besonders unterhaltsam war. Wenn es um gigantischen Caesar-Salat geht, ist sie die richtige Adresse.
Über 20 Jahre nach meinem ersten Einsatz als Autor hat meine Frau Nancy L. Urbano erneut viele Monate eingeschränkter Kommunikation mit mir mit einer Mischung aus Resignation, Verzweiflung sowie Verständnis und Unterstützung im richtigen Moment ertragen. In der gleichen Zeit hat sich unser Hund Darla einen Großteil der Zeit damit zufriedengegeben, stundenlang zu dösen, während ich auf den Computermonitor starrte. Aber Darla vergaß nie, mich daran zu erinnern, dass es ein Leben jenseits der Tastatur gibt.
[1] http://stackoverflow.com/
[2] http://www.artima.com/shop/overview_of_the_new_cpp
[3] http://scottmeyers.blogspot.com/2014/02/help-me-name-my-book.html
[4] http://erdani.com/index.php/books/modern-c-design/
[5] http://www.viva64.com/en/b/0060/
[6] http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets
[7] http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/
[8] http://flamingdangerzone.com/cxx11/2012/05/27/dependent-names-bliss.html
[9] http://stackoverflow.com/questions/21052377/whats-a-use-case-for-overloading-member-functions-on-reference-qualifiers
[10]...
Erscheint lt. Verlag | 15.7.2015 |
---|---|
Übersetzer | Thomas Demmig |
Verlagsort | Heidelberg |
Sprache | deutsch |
Themenwelt | Informatik ► Programmiersprachen / -werkzeuge ► C / C++ |
Schlagworte | C++11 • C++14 • Programmiersprache • Programmierung • Softwareprogrammierung |
ISBN-10 | 3-95875-050-8 / 3958750508 |
ISBN-13 | 978-3-95875-050-0 / 9783958750500 |
Haben Sie eine Frage zum Produkt? |
![PDF](/img/icon_pdf_big.jpg)
Größe: 1,6 MB
Digital Rights Management: ohne DRM
Dieses eBook enthält kein DRM oder Kopierschutz. Eine Weitergabe an Dritte ist jedoch rechtlich nicht zulässig, weil Sie beim Kauf nur die Rechte an der persönlichen Nutzung erwerben.
Dateiformat: PDF (Portable Document Format)
Mit einem festen Seitenlayout eignet sich die PDF besonders für Fachbücher mit Spalten, Tabellen und Abbildungen. Eine PDF kann auf fast allen Geräten angezeigt werden, ist aber für kleine Displays (Smartphone, eReader) nur eingeschränkt geeignet.
Systemvoraussetzungen:
PC/Mac: Mit einem PC oder Mac können Sie dieses eBook lesen. Sie benötigen dafür einen PDF-Viewer - z.B. den Adobe Reader oder Adobe Digital Editions.
eReader: Dieses eBook kann mit (fast) allen eBook-Readern gelesen werden. Mit dem amazon-Kindle ist es aber nicht kompatibel.
Smartphone/Tablet: Egal ob Apple oder Android, dieses eBook können Sie lesen. Sie benötigen dafür einen PDF-Viewer - z.B. die kostenlose Adobe Digital Editions-App.
Buying eBooks from abroad
For tax law reasons we can sell eBooks just within Germany and Switzerland. Regrettably we cannot fulfill eBook-orders from other countries.
aus dem Bereich