objekte schneller initalisieren



  • lol schrieb:

    warum tust du alles auf den heap? das tut ja weh.

    he "lol" so langsam weis ich es sogar auch.
    ich habe arbeite ja schon dran es zu verbesseren, allerdings habe ich immer noch nichts brauchbares gefunden über die grösse des stacks und ab wann ich etwas auf den heap lege.
    auch hier http://www.c-plusplus.net/forum/viewtopic.php?t=69176 ist keine definitive aussage, naja ich werde weitersuchen



  • Wenn du schätzt, dass dein Objekt mehrere MB groß ist wirst du es nicht auf den Stack legen.

    Aber allgemein kommt sowas gar nicht vor. Meistens hat man Objekte, die intern Teile auf dem Heap haben. Das eigentlich Objekt legst du dennoch auf den Stack.

    class Foo {
       Foo ()
          : bar_ (1000000)
       {}
       vector<double> bar_;
    };
    
    int main ()
    {
       Foo foo;
    }
    

    foo selbst liegt zwar auf dem Stack, die Millionen doubles, die intern verwaltet werden jedoch auf dem Heap.



  • Normalerweise ist der Stack 1 MB groß. Deine Timer-Instanz verbraucht wahrscheinlich nur wenige BYTES. Kriegst du mit sizeof(CTimer) raus. Da gibts doch wohl wirklich nichts mehr zu überlegen. 😉



  • Helium schrieb:

    Wenn du schätzt, dass dein Objekt mehrere MB groß ist wirst du es nicht auf den Stack legen.

    Aber allgemein kommt sowas gar nicht vor. Meistens hat man Objekte, die intern Teile auf dem Heap haben. Das eigentlich Objekt legst du dennoch auf den Stack.

    class Foo {
       Foo ()
          : bar_ (1000000)
       {}
       vector<double> bar_;
    };
    
    int main ()
    {
       Foo foo;
    }
    

    foo selbst liegt zwar auf dem Stack, die Millionen doubles, die intern verwaltet werden jedoch auf dem Heap.

    ich denke das habe ich verstanden. liegt daran das vector dynamisch ist und somit automatisch auf den heap landet. oder ?

    .... schrieb:

    Normalerweise ist der Stack 1 MB groß.

    das hilft mir schon sehr viel weiter. dank dir

    .... schrieb:

    Deine Timer-Instanz verbraucht wahrscheinlich nur wenige BYTES. Kriegst du mit sizeof(CTimer) raus. Da gibts doch wohl wirklich nichts mehr zu überlegen. 😉

    war mir schon fast klar 😃



  • Normalerweise ist der Stack 1 MB groß

    Wie kommst du darauf?



  • Helium schrieb:

    Normalerweise ist der Stack 1 MB groß

    Wie kommst du darauf?

    ist es nicht so ? wie gross ist er dann und wo ist die grenze ?



  • ich denke das habe ich verstanden. liegt daran das vector dynamisch ist und somit automatisch auf den heap landet. oder ?

    Jein. Ein Teil landet auf dem Heap.

    Einfacher:

    struct Foo {
       int x;
       int * y;
    
       Foo () 
          : y(new int)
       {}
       ~Foo () 
       {
          delete y;
       }
    };
    
    int main ()
    {
       Foo foo;
    }
    

    foo.x liegt auf dem Stack. foo.y verweist auf den Heap.

    ist es nicht so ? wie gross ist er dann und wo ist die grenze ?

    Du kannst 1MB erstmal annehmen. Aber es gibt keine festen richtlinien. Es könnten genausogut 5MB sein.



  • Helium schrieb:

    Du kannst 1MB erstmal annehmen. Aber es gibt keine festen richtlinien. Es könnten genausogut 5MB sein.

    weisst du zufällig wo ich mich da am besten schlau mache. vielleicht auch ein gutes buch.

    noch ne dumme stack frage, ich habe irgendwo (online tut) gelesen das für jeden thread ein eigener stack eingerichtet wird. für mich heisst, da ich keine eigenen threads verwende, das alle objekte in meiner engine (wenn ich sie umschreibe) nicht grösser als der angenommene wert von 1mb sein sollten. sehe ich das richtig ?



  • Ich musste mir noch nie gedanken über die Stackgröße machen.

    Das einzige, was normalerweise groß ist, sind Felder oder vergleichbares. Wenn du beispielsweise std::vector verwendest sind die Daten automatisch aud dem Heap. Das bischen, was normale Objekte ausmachen kannst du eigentlich ignorieren.



  • Helium schrieb:

    Ich musste mir noch nie gedanken über die Stackgröße machen.

    Das einzige, was normalerweise groß ist, sind Felder oder vergleichbares. Wenn du beispielsweise std::vector verwendest sind die Daten automatisch aud dem Heap. Das bischen, was normale Objekte ausmachen kannst du eigentlich ignorieren.

    nagut 🙂



  • Helium schrieb:

    Normalerweise ist der Stack 1 MB groß

    Wie kommst du darauf?

    Wahrscheinlich hat er in sein Compiler- bzw. Platformhandbuch geschaut. Wenn er dann noch den VC unter Windows verwendet, hat er wahrscheinlich folgendes gelesen:

    Die Option /FZahl legt die Größe des Programm-Stacks in der angegebenen Anzahl von Bytes fest. Ohne Angabe dieser Option wird die Standard-Stack-Größe 1 MB verwendet

    @miller_m
    Unter anderen Systemen bzw. Compilern sieht das natürlich anders aus.


Anmelden zum Antworten