Template und Geschwindigkeit



  • warum nicht
    Vector3D<float> v1(5, 70, 0.3);
    glVertex3fv(v1);
    ?



  • volkard schrieb:

    warum nicht
    Vector3D<float> v1(5, 70, 0.3);
    glVertex3fv(v1);
    ?

    gehe davon aus das du den umwandlungsoperator meinst. ich muss zugeben das ich nicht so der freund davon bin. 😃



  • miller_m schrieb:

    gehe davon aus das du den umwandlungsoperator meinst. ich muss zugeben das ich nicht so der freund davon bin. 😃

    nein. ich meine eine überladene glVertex3fv(Vector3D)



  • volkard schrieb:

    miller_m schrieb:

    gehe davon aus das du den umwandlungsoperator meinst. ich muss zugeben das ich nicht so der freund davon bin. 😃

    nein. ich meine eine überladene glVertex3fv(Vector3D)

    so habe ich es auch gemacht ;), ala

    // aus meinem opengl wrapper
    void OglTranslate(float x, float y, float z)	{ glTranslatef(x, y, z); }
    void OglTranslate(double x, double y, double z)	{ glTranslated(x, y, z); }
    template<
    	class Vector_>
    void OglTranslate(const Vector_ &v)
    { OglTranslate(v[0], v[1], v[2]); }
    


  • miller_m schrieb:

    template<
    	class Vector_>
    void OglTranslate(const Vector_ &v)
    { OglTranslate(v[0], v[1], v[2]); }
    

    ach, man muß gar kein array benutzen, es geht auch mit drei parametern?
    ist dann das nicht viel besser und die array-version viel schlechter?
    also netter zum verwenden ist die array-version allemal nicht.
    was ist schneller. sei mir erlaubt, daß ich nur ein klitzebisschen in die zukunft gucke auf den ia-64 mit registerstack. da kosten übergaben herzlich wenig. und ram ist wie gehabt teuer. mir scheinen die drei parameter auch schneller.
    vielleicht sollten wir den vector3d umstellen wollen auf die 3-parameter-version?

    @miller_m: du hast ja bereits sowas gemacht und mehr erfahrung als wir. warum hast du im Vector die daten als array und nicht als x,y,z?



  • volkard schrieb:

    @miller_m: du hast ja bereits sowas gemacht und mehr erfahrung als wir. warum hast du im Vector die daten als array und nicht als x,y,z?

    ironie?
    wenn nicht. ich ging davon aus das der thread ersteller seine gründe hat, etvl vielleicht auch irgendwelche dx funktionen.
    in meiner vektorklasse verwende ich noch ein array wegen vertexarrays und weil ich es früher auch so gemacht habe wie der thread ersteller 😃 . da ich diese auch irgendwann mal verbessern möchte fliegt vermutlich das array in der vektorklasse auch raus. aber einen triftigen grund gibt es afaik nicht.

    volkard schrieb:

    ach, man muß gar kein array benutzen, es geht auch mit drei parametern?
    ist dann das nicht viel besser und die array-version viel schlechter?
    vielleicht sollten wir den vector3d umstellen wollen auf die 3-parameter-version?

    ich habe auch nie behauptet das sie besser oder schlechter sind, ich kann nur ganz gut nachvollziehen was er sich dabei gedacht hat 😉



  • Mensch da habe ich ja was losgetreten...

    Nun stelle ich mir wirklich die Frage was davon nun besser ist, einzelne Variablen oder das Array? Vor allem sehe ich da keinen Vorteil wenn man ein Array verwendet und dann die Funktion mit den Parametern aufruft, anstell das Array zu übergeben.

    // aus meinem opengl wrapper
    void OglTranslate(float x, float y, float z)    { glTranslatef(x, y, z); }
    void OglTranslate(double x, double y, double z)    { glTranslated(x, y, z); }
    template<
        class Vector_>
    void OglTranslate(const Vector_ &v)
    { OglTranslate(v[0], v[1], v[2]); }
    

    Aber wenn man nun das Array nicht verwendet, dann kann man doch nur sehr schwerlich eine Arrayindizierung vornehmen ( Operator[] )?

    float operator[] (int i) {
      switch(i) {
         case 0 : return x;
         case 1 : ...
      }
    }
    

    Das ist doch sicherlich dann keine tolle Lösung oder? Irgendwie verwirrt mich das 😮

    @volkard Danke für die Hinweise bei meiner Headerdatei 🙂



  • Tobain schrieb:

    Nun stelle ich mir wirklich die Frage was davon nun besser ist, einzelne Variablen oder das Array?

    Da gibt es leider keine Universallösung. Wenn dich die einzelnen Komponenten getrennt interessieren, ist es wohl besser, sie in getrennte Member zu packen. Wenn du den Vektor als Einheit siehst und (z.B.) die Komponenten in Serie (Schleifen o.ä.) abarbeiten willst, bietet sich das Array an.



  • Tobain schrieb:

    Aber wenn man nun das Array nicht verwendet, dann kann man doch nur sehr schwerlich eine Arrayindizierung vornehmen ( Operator[] )?

    float operator[] (int i) {
      switch(i) {
         case 0 : return x;
         case 1 : ...
      }
    }
    

    wozu wird der op[] gebraucht?



  • wozu wird der op[] gebraucht?

    Ich benötige ihn um ab und zu eine einzelne Komponente des Vektors auszulesen, da z.B. manchmal nur der z-Wert interressant ist.

    Des weiteren möchte ich schon per Schleife über die Elemente iterieren können (für manche Algorithmen ist das ganz sinnvoll).

    @volkard
    Warum soll ich eigentlich das "inline" weglassen?
    Also ohne das include "*.cpp" am Ende der Headerdatei will er mir den Code nicht kompilieren und haut so etwas raus:

    g++.exe -c main.cpp -o main.o -I"D:/Dev-Cpp/include/c++"  -I"D:/Dev-Cpp/include/c++/mingw32"  -I"D:/Dev-Cpp/include/c++/backward"  -I"D:/Dev-Cpp/include"   
    
    vector3d.h: In instantiation of `Vector3D<float>':
    main.cpp:23:   instantiated from here
    vector3d.h:68: error: template-id `operator+<>' for `Vector3D<float>& 
       operator+(const Vector3D<float>&, const Vector3D<float>&)' does not match 
       any template declaration
    
    vector3d.h:69: error: template-id `operator-<>' for `Vector3D<float>& 
       operator-(const Vector3D<float>&, const Vector3D<float>&)' does not match 
       any template declaration
    
    vector3d.h:70: error: `operator*' not defined
    
    vector3d.h:71: error: `operator*' not defined
    
    vector3d.h:72: error: `operator/' not defined
    
    vector3d.h:73: error: `operator*' not defined
    
    vector3d.h:74: error: template-id `operator^<>' for `Vector3D<float>& 
       operator^(const Vector3D<float>&, const Vector3D<float>&)' does not match 
       any template declaration
    
    vector3d.h:76: error: template-id `operator==<>' for `bool operator==(const 
       Vector3D<float>&, const Vector3D<float>&)' does not match any template 
       declaration
    
    vector3d.h:77: error: template-id `operator!=<>' for `bool operator!=(const 
       Vector3D<float>&, const Vector3D<float>&)' does not match any template 
       declaration
    
    vector3d.h:20: warning: inline function `Vector3D<T>::Vector3D() [with T = 
       float]' used but never defined
    


  • Tobain schrieb:

    @volkard
    Warum soll ich eigentlich das "inline" weglassen?

    "inline" gehört an die Funktionsdefinition, nicht an die Deklaration. (und die meisten Compiler entscheiden sowieso selbständig, welche Funktionen sie inline erweitern wollen).
    (und Templates und Übersetzungseinheiten sind sowieso ein Thema für sich ;))



  • Tobain schrieb:

    wozu wird der op[] gebraucht?

    Ich benötige ihn um ab und zu eine einzelne Komponente des Vektors auszulesen, da z.B. manchmal nur der z-Wert interressant ist.

    da geht auch T getZ(){return z};

    Des weiteren möchte ich schon per Schleife über die Elemente iterieren können (für manche Algorithmen ist das ganz sinnvoll).

    bleib mal ernsthaft. du wirst nicht eine schleife bauen, die über drei elemente iterieret und dir gleichzeitig woanders gedanken um speed machen.

    @volkard
    Warum soll ich eigentlich das "inline" weglassen?

    wels der compiler innherhalb von klassen selber hinschreibt.
    und außerhalb schreibt er's da hin, wo es seinermeinung nach sinnvoll ist. und er hat ne gute einschätzung der lage. ja, in der tat. bei mir ist der resultierende code eigentlich immer schneller, wenn ich ihm freie hand lasse. manchmal ist ja kleinerer code schneller, weil caches besserausgenutzt werden und branch-precognition.

    Also ohne das include "*.cpp" am Ende der Headerdatei will er mir den Code nicht kompilieren und haut so etwas raus:

    trotzdem nicht *.cpp includen. nenn sie um in *.inc oder *.imp, oder *_cpp.h oder so.
    makefiles und so müssen sich drauf verlassen können, daß alle *.cpp durchcompiliert werden können.

    außerdem schreibt man die implemetierungen von template-funktionen eh normalerweise in den header.



  • Man das ist irgendwie alles nicht so durchsichtig, ich bräuchte mal das "perfekte Beispiel" mit ner guten Erklärung. Leider wird immer nur ein Aspekt behandelt und wenn 2 Aspekte zusammenkommen, dann ist eh alles wieder fürn Ar***.

    Ein großes Danke an alle die sich bis jetzt bemüht haben mir zu helfen 🙂


Anmelden zum Antworten