Initialisierung von Variablen



  • Hallo,

    ich bin auf folgenden Code gestoßen:

    interact::interact(wxWindow* parent, int id, const wxPoint& position, const wxSize& size) 
    
    	: canvas(parent, id, position, size){ 
    	m_timerelapse(10),
    	m_timer(this,ID_TIMER), 
    	m_givenboundaries(),
    	p_frame((Frame *)parent),
    	m_boundarymode(-1),
    	m_showboundaries(true), 
    	m_useboundaries(false),
    	m_zoomindown(false),
    	m_zoomoutdown(false),
    	m_leftdown(false),
    	m_rightdown(false),
    ...
    

    Was mich ein wenig konfus macht, ist dass die klassenmembervariablen die mit m_ oder p_ beginnen schon vorab direkt nach dem Basiskonstruktoraufruf mit werten belegt werden.

    Ist es besser/schneller als man sie danach regulär innerhalb des Anweisungsblocks belegt?

    interact::interact(wxWindow* parent, int id, const wxPoint& position, const wxSize& size) 
    	: canvas(parent, id, position, size){ 
    	m_timerelapse = 10;
    	...
    

  • Mod

    init_ schrieb:

    Ist es besser/schneller als man sie danach regulär innerhalb des Anweisungsblocks belegt?

    Ja, denn dann werden sie gleich mit dem richtigen Wert belegt, anstatt erst mit einem Standardwert belegt zu werden und danach dem richtigen Wert zugewiesen zu bekommen. Außerdem kann man so auch Member ohne Standardkonstruktor initialisieren.



  • Nein, sowohl die () alsauch =-Notation beschreiben den selben Prozess: Die Initialisierung und den Konstruktoraufruf. Bei den von dir gebrachten Beispielen wird jedoch vom Compiler zusätzlich immernoch der Standardkonstruktor der jeweiligen Member aufgerufen um das interact-Objekt zu initialisieren. Deshalb ist es performanter, die Elementinitialisierungsliste zu benutzen.



  • Jup ist schneller.



  • Super!

    Danke für die schnellen Antworten.

    Sieht leider irgendwie komisch aus.. wird der Compiler bei der Optimierung nicht automatisch die zweite Form in die erste überführen?



  • init_ schrieb:

    Super!

    Danke für die schnellen Antworten.

    Sieht leider irgendwie komisch aus.. wird der Compiler bei der Optimierung nicht automatisch die zweite Form in die erste überführen?

    Bei nicht trivialen Typen (aka Klassen) kann er das ja nicht. Du sagst dem Compiler erst: Benutz mal den Standardkonstruktor. Und dann benutzt Du den Assignment-Operator um den richtigen Wert zuzuweisen. Wie soll der Compiler jetzt erkennen, dass Du nicht genau das willst?

    Ad aCTa schrieb:

    Nein, sowohl die () alsauch =-Notation beschreiben den selben Prozess: Die Initialisierung und den Konstruktoraufruf. Bei den von dir gebrachten Beispielen wird jedoch vom Compiler zusätzlich immernoch der Standardkonstruktor der jeweiligen Member aufgerufen um das interact-Objekt zu initialisieren. Deshalb ist es performanter, die Elementinitialisierungsliste zu benutzen.

    Du sagst im zweiten Satz, daß der erste nicht stimmt. 😉



  • Und bestimmte Dinge kann man nicht nachträglich initialisieren, d.h. muss man in der Initializer-List initialisieren:
    * Klassen die keinen Default-Ctor haben
    * const Member
    * Referenzen
    * Klassen die zwar einen Default-Ctor haben, der aber "nicht passt", und wo man das Objekt nachträglich nichtmehr in den "passenden" Zustand bringen kann
    (Also z.B. Klassen die keinen Assignment-Operator haben)



  • Was soll die Klammer('{') dort?

    interact::interact(wxWindow* parent, int id, const wxPoint& position, const wxSize& size)
    
        : canvas(parent, id, position, size){ //<-- ?
        m_timerelapse(10), 
    /*...*/
    

    Sollte der Compiler so nicht schlucken...

    bb



  • erm doch, weil die Klammer nach dem Funktionskopf steht, vielleicht hat dich der Aufruf des Basisklassen Constructors verwirrt 🙂



  • RedPuma schrieb:

    erm doch, weil die Klammer nach dem Funktionskopf steht, vielleicht hat dich der Aufruf des Basisklassen Constructors verwirrt 🙂

    erm nein, weil DANACH nämlich erst die initializer-list kommt. und die müsste davor kommen.



  • > Du sagst im zweiten Satz, daß der erste nicht stimmt. 😉

    Nö, ich ging davon aus, dass er da irgendwelche Copy-Konstruktoren aufruft, da dass ja keine Initializer-List ist.



  • Nach genauem hinschauen stimme ich hustbaer doch zu, schließlich stehen nach den Anweisungen auch Kommas und keine Semikolons. Lieber zwei mal angucken bevor man klugscheißt ne? 🙂



  • > Lieber zwei mal angucken bevor man klugscheißt ne? 🙂

    Achte mal bitte auf deine Umgangsformen, ja? In diesem Fall ist das doch sehr subjektiv zu betrachten.



  • Ad aCTa schrieb:

    > Lieber zwei mal angucken bevor man klugscheißt ne? 🙂

    Achte mal bitte auf deine Umgangsformen, ja? In diesem Fall ist das doch sehr subjektiv zu betrachten.

    Ich denke mal er meinte sich selber... 😉


Log in to reply