Was fehlt in C++11?



  • Reflection hat sicherlich Anwendungsgebiete, aber leider auch viele Nachteile. Der Compiler muss für jede Klasse und jeden ihrer Member Buch führen, was das Speicherabbild des Programms unnötig vergrößert. Schonmal ein deutlicher Verstoß gegen das "Don't pay for what you don't use"-Prinzip, aber der Speicher ist noch das kleinste Übel. Mit Reflection kommt z.B. auch die dynamische Erstellung von Typen zur Laufzei mitsamt Methoden- und Datenmembern, von denen dann natürlich auch Objekte instantiiert werden sollen. Das zieht einen Rattenschwanz an Sprachänderungen nach sich, die, da C++ nicht in einer VM läuft, nicht trivial umsetzbar sind (das nächste ist z.B.: diese Objekte sollen natürlich auch als Parameter übergeben werden, also braucht man einen allgemeinen Objekttypen, der auch Objekte dynamisch erstellter Typen aufnehmen kann. Pass-by-value ist dann bei solchen Objekte sowieso nicht möglich). Bei managed Sprachen ist das kein Problem, auch sind da alle Informationen schon vorhanden, aber bei nativen Sprachen gibt es da sehr viele Hürden.

    In Anbetracht dessen und der Tatsache, dass es äußerst wenige Probleme gibt, die man nicht auch auf andere Weise ähnlich gut oder besser als mit Reflection umsetzen kann, verzichte ich darauf in C++ gerne.
    Davon abgesehen finde ich Reflection in C# nicht schön gelöst. Da muss man so viele unnötige Zwischenschritte gehen, das hätte man viel direkter machen können.

    Wirklich toll wäre aber (wie ich schon schrieb) umfassende Reflection zur Compilezeit. Ich vermute aber, da mangelt es vor allem an einem guten und umfassenden Design.



  • Genau. Ich finde das wichtigste Argument gegen Reflection in C++ ist dass praktisch alles was man modernes C++ nennen würde darauf aufbaut dass der Compiler komplette Klassenhierarchien einfach wegoptimiert, inlined etc. Wie der Verfasser von diesem Posting es besser gesagt hat als ich es je könnte: In deinem kompilierten C++ Programm gibt es keine Klassen mehr, die sind weg. Wenn Reflection ins Spiel kommt wäre das nichtmehr machbar was bedeutet dass C++ mit Reflection praktisch nutzlos würde. Das ist ein Preis den ich nicht bereit bin zu zahlen für ein derart unwichtiges Komfortfeature wie Reflection...



  • RTTI bräuchte eine einheitliche Syntax für typeid. Warum kann man nicht die Syntax für den String vorgeben? Das selbst das den COmpiler-Herstellern überlassen wird, ist mir unverständlich.

    Leider hat es ja kein Modulkonzept in C++11 geschafft. Es gab damals einen Vorschlag, der eingereicht wurde. Ich kann ihn zwar nicht qualitativ beurteilen, aber ich finde sowas nötig.

    Zum Thema Reflection: es gibt für Java ein paar nette Ideen, die Gebrauch davon machen. Eine gute Möglichkeit ist es z.B. für Unit-Tests zu gebrauchen. Aber das ist "nur" eine elegante Arbeitserleichterung. In C++ habe ich Möglichkeiten, meine Unit-Tests und Test-Cases zu registrieren:

    1. per Hand (also expliziten Code)
    2. per TMP (s. TUT-Framework)
    3. per Makros (s. gtest)
    4. per externen Präprozessor (s. CxxTest)

    D.h. ich kann sehr wohl die fehlenden Reflections durch alternative Technik in C++ ersetzen und erreiche mein Ziel.

    Bei Typabfragen kann ich mir aber vorstellen, das man dann halt einfach zus. Methoden in den Klassen anbietet. Wo ist das Problem? Auch kann man Typetraits nutzen.


Anmelden zum Antworten