zurück zum Artikel

Mythen der Blog-Leser

Rainer Grimm

Mit welchen weiteren Mythen beim Einsatz von C++ haben nun die Leser von heise Developer zu kämpfen? Rainer Grimm fasst die Diskussion im Forum zu seinem Blog zusammen.

Ich war sehr neugierig, welche weiteren Mythen mir meine Leser schicken würden. Insbesondere die Leser auf diesem Blog waren ziemlich aktiv. Ich erhielt ein paar E-Mails und beobachtete eine lebhafte Diskussion auf heise Developer [1].

Bevo ich zu den mir zugeschickten Mythen schreibe, möchte ich zuerst die letzte Regel der C++ Core Guidelines vorstellen. Hier ist der letzte Mythos:

NR.7: Don’t: Make all data members protected [2]

Daten, die als "protected" deklariert sind, machen dein Programm anspruchsvoller und fehleranfälliger. Falls in der Basisklasse protected-Daten zum Einsatz kommen, lässt sich nicht mehr über abgeleitete Klassen in Isolation nachdenken. Damit brichst du die Kapselung. Du musst dir immer Gedanken zu ganzen Klassenhierarchien machen.

Das bedeutet, diese drei Fragen müssen in der Regel beantwortet werden.

  1. Muss ich einen Konstruktor implementieren, um das protected-Datum richtig zu initialisieren?
  2. Welchen Wert besitzen das protected-Datum, wenn ich es verwende?
  3. Welche Funktionalität wird in Mitleidenschaft gezogen, wenn ich das protected-Datum verändere?

Natürlich wird die Beantwortung dieser Fragen umso anspruchsvoller, je mehr die Klassenhierarchie in die Tiefe wächst.

Streng genommen ist ein protected-Datum eine globale Variable in der Klassenhierarchie. Das erste Gebot der Softwareentwicklung lautet aber: Vermeide globale Daten.

Nun zu den Mythen:

Ehrlich gesagt, gegen diesen Mythos zu argumentieren, ist ziemlich schwierig und im Allgemeinen nicht möglich, wenn es um die C++-Bibliothek geht. Dies ist der Grund, dass ich nur ein paar Beobachtungen am Ende dieses Kapitels präsentiere. Zuerst einmal kommen aber die harten Fakten auf den Tisch. Der "Technical Report on C++ Performance" hilft mir dabei sehr.

2006 verfasst die Working Group WG 21 das Dokument ISO/IEC TR 18015 [4]. Der Titel hört sich sehr sperrig an. Tatsächlich ist das Dokument die erste Wahl, wenn es darum geht, die Performanz von C++ zu analysieren. Diesen folgenden Aspekt bringt das Dokument direkt auf den Punkt:

Verfasser des gut 200-seitigen Reports sind so bekannte Namen wie Dave Abrahams, Howard Hinnand, Dietmar Kühl, Dan Saks, Bill Seymour, Bjarne Stroustrup und Detlef Vollmann.

In dem Dokument selbst geht es um die C++-Sprachmerkmale, deren Kosten und Verwendung, dem Erzeugen effizienter Bibliotheken in C++, der Nutzung von C++ in Embedded-Systemen und einer Schnittstelle in C++, um mit Hardware zu kommunizieren. Insbesondere auf die C++-Sprachmerkmale, deren Kosten und Verwendung will ich genauer eingehen.

C++-Sprachmerkmale, Kosten und Verwendung

Bei ihrer Analyse greifen die Autoren auf drei Computerarchitekturen mit fünf verschiedenen C++-Compilern zurück. Die Compiler rufen sie mit unterschiedlichen Optimisierungsstufen auf. Die Ergebnisse, die ich deutlich vereinfachend darstelle, sind sehr aufschlussreich.

Namensräume

Typkonvertierungs-Operatoren

Klasse

Funktionsaufrufe auf Objekten

Mehrfachvererbung

Run-Time Type Information (RTTI)

Ausnahmebehandlung

Templates

Die genauen Details, die exakten Zahlen und alle weiteren Punkte lassen sich in dem Report TR18015.pdf [5] schön nachlesen.

MISRA C++ (Motor Industry Software Reliability Association) stellt Regeln für das Schreiben von Software in sicherheitskritischen System auf. MISRA C++ wurde ursprünglich für die Automobilindustrie entwickelt, ist aber mittlerweile Industriestandard im Flugzeugbau, Militär und auch im Medizinbereich.

MISRA C++ stellt heraus, warum die Bedeutung von C++ in sicherheitskritischen System immer weiter zunimmt (1.1 The use of C++ in critical systems) :

Ein bitterer Wermutstropfen bleibt aber. MISRA C++ basiert auf klassischem C++. Dies ist vereinfachend gesprochen C++98. Modernes C++ hat aber deutlich mehr zu bieten für Embedded-Systeme. Diese Beobachtung gilt leider auch für den bereits vorgestellten Report Technical report on C++ performance [7].

Ohne ein paar Beobachtungen zu modernem C++ kann ich diesen Artikel nicht beenden. Modernes C++ ist ein Begriff, der meist für die C++-Standards C++11, C++14 und C++17 eingesetzt wird.

Die Schwierigkeit, die Features der C++ Bibliothek mit ihrem C Pendant zu vergleichen, besteht vor allem darin, dass ein Vergleich äquivalente Datenstrukturen, Algorithmen oder Programme voraussetzt. Das heißt, damit lässt sich ein C-String mit einem C++-String nicht vergleichen, denn die C++-Variante verwaltet zum Beispiel automatisch ihren Speicher. Dieselbe Beobachtung lässt sich auf einen C-Array und die Container der Standard Template Library anwenden. Diese Punkte halten mich aber nicht davon ab, ein paar Punkte aufzuzählen. Wenn du mehr Details wissen willst, lese den hinterlegten Artikel.

Ich hätte nicht gedacht, dass ich fast einen ganzen Artikel benötige, um gegen die Mythen zur Performanz und zum Speicherverbrauch von C++ zu argumentieren. Du kannst dir vorstellen, dass ich weitere Mythen zugeschickt bekommen habe. Auf diese werde ich in meinem nächsten Artikel eingehen. Falls du noch einen Mythos kennst, kannst du ihn mir auch gerne schicken: rainer.grimm@modernescpp.de [14]. ( [15])


URL dieses Artikels:
https://www.heise.de/-4504253

Links in diesem Artikel:
[1] https://www.heise.de/forum/heise-Developer/Kommentare/C-Core-Guidelines-Mehr-Nichtregeln-und-Mythen/forum-432200/comment/
[2] http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rnr-protected-data
[3] http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
[4] http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
[5] http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
[6] http://www.misra.org.uk/Activities/tabid/56/Default.aspx
[7] http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
[8] https://heise.de/-4431985
[9] https://www.grimm-jaud.de/index.php/blog/speicher-performanz-overhead-von-smart-pointern
[10] https://www.grimm-jaud.de/index.php/blog/type-traits-performanz-zaehlt
[11] https://www.heise.de/developer/artikel/C-Core-Guidelines-Programmierung-zur-Compilezeit-mit-constexpr-4296535.html
[12] https://www.grimm-jaud.de/index.php/blog/copy-versus-move-semantik-ein-paar-zahlen
[13] https://www.grimm-jaud.de/index.php/blog/perfect-forwarding
[14] mailto:rainer.grimm@modernescpp.de
[15] mailto:rainer@grimm-jaud.de