Wann ist etwas auf dem Heap/Stack?



  • Hallo zusammen. 🙂

    Ich freunde mich grade mit new an und habe eine Frage zu folgendem Code-Schnipsel:

    [code]class MyClass1 {
    public:
      struct MyStruct {
        int x;
      };
    
      MyStruct myStruct;
    }
    -------------------------
    #include "MyClass1.h"
    
    class MyClass2 {
    public:
      struct MyStruct {
        int x;
      };
    
      MyStruct myStruct;
      MyClass1 myClass1;
    }[/code]
    

    Anschließend erzeuge ich

    MyClass2 myClass2 = new MyClass2()
    

    .

    Was befindet sich auf dem Heap?

    myClass2 --> Ja
    myClass2.myStruct --> ???
    myClass2.myClass1 --> ???
    myClass2.myClass1.myStruct --> ???



  • Die Member einer Klasse befinden sich dort, wo sich die Instanz befindet.



  • Zisko schrieb:

    MyClass2 myClass2 = new MyClass2()
    

    das ist java und kein c++
    scott meyers hat in seinem more effective c++ was über heap und stack geschrieben, wie man rauskriegt wo was liegt, kannst mal reinschauen, ist sehr interessant.

    zu deiner frage: ich denke alle variablen liegen auf dem heap.
    die frage ist nur, was sind deine intentionen?



  • Skym0sh0 schrieb:

    wie man rauskriegt wo was liegt

    Da gibts nix rauzukriegen. Die Regeln sind simpel und intuitiv.



  • Skym0sh0 schrieb:

    das ist java und kein c++

    Ist es denn falsch? Macht man es anders besser? Und wenn ja, wie?



  • Zisko schrieb:

    Skym0sh0 schrieb:

    das ist java und kein c++

    Ist es denn falsch?

    Jup

    Zisko schrieb:

    Macht man es anders besser? Und wenn ja, wie?

    Richtig:

    MyClass* m = new MyClass;//Zeiger auf die allokierte Instanz im Heap
    

    Es geht aber auch

    MyClass& m = *new MyClass;//Ist aber unüblich, macht man nicht
    

    Besser:

    MyClass m;
    


  • Zisko schrieb:

    Skym0sh0 schrieb:

    das ist java und kein c++

    Ist es denn falsch? Macht man es anders besser? Und wenn ja, wie?

    Hast du mal versucht, das zu übersetzen?



  • Stimmt, ich habe das Sternchen vergessen. Ich habe das kleine Beispiel nicht übersetzt 🙂

    Wenn ich die richtige Zeile richtig verstehe, dann soll ich garkein new verwenden?



  • Zisko schrieb:

    Wenn ich die richtige Zeile richtig verstehe, dann soll ich garkein new verwenden?

    Ja! Genau! (ich meine nein! NEIN!) Du hast es erfasst!



  • Was haltet ihr dann von der Empfehlung, dass ich Objekte mit new erzeuge, da sonst der Stack irgendwann voll ist?



  • Sone schrieb:

    Besser:

    MyClass m;
    

    das ist nicht besser, das ist lediglich ein anderer anwendungsfall,
    wenn z.b. zur kompilierzeit die objekte oder deren anzahl nicht feststeht.



  • Zisko schrieb:

    Was haltet ihr dann von der Empfehlung, dass ich Objekte mit new erzeuge, da sonst der Stack irgendwann voll ist?

    Musst du nie! Dafür gibt es STL-Container (die automatisch alle Objekte im Heap allokieren) und std::(basic_)string .



  • um stack größen würde ich mir keine sorgen machen, solange man nicht statische arrays der größe xxxtausend macht, sollte das passen. für alles adnere gibt es die STL-Container

    Kellerautomat schrieb:

    Skym0sh0 schrieb:

    wie man rauskriegt wo was liegt

    Da gibts nix rauzukriegen. Die Regeln sind simpel und intuitiv.

    achja?
    pass auf, ich gebe deiner funktion ein objekt und deine funktion sagt mir ob heap oder stack. ok?



  • Skym0sh0 schrieb:

    achja?
    pass auf, ich gebe deiner funktion ein objekt und deine funktion sagt mir ob heap oder stack. ok?

    Und was soll das bringen? 😕



  • wie gesagt, ichv erweise auf das entsprechende kapitel in more effective c++...



  • Ich bin Regelungstechniker, der nun auch die Aufgaben der Programmierung für Signalprozessoren mitübernehmen soll, da in unserem kleinem Entwicklungsteam der Programmierer die Stelle gewechselt hat.

    Muss ich mir bei eingebetteten Systemen auch keine Gedanken um den Stack machen?



  • Skym0sh0 schrieb:

    um stack größen würde ich mir keine sorgen machen, solange man nicht statische arrays der größe xxxtausend macht, sollte das passen. für alles adnere gibt es die STL-Container

    Kellerautomat schrieb:

    Skym0sh0 schrieb:

    wie man rauskriegt wo was liegt

    Da gibts nix rauzukriegen. Die Regeln sind simpel und intuitiv.

    achja?
    pass auf, ich gebe deiner funktion ein objekt und deine funktion sagt mir ob heap oder stack. ok?

    http://www.codeproject.com/Articles/35206/Pointer-pointing-to-Stack-or-Heap :p



  • Zisko schrieb:

    Muss ich mir bei eingebetteten Systemen auch keine Gedanken um den Stack machen?

    Das ist die falsche Frage.

    Es geht nicht um Stack vs Heap. Die wirkliche Frage ist die Lebenzeit eines Objektes.
    Soll es weiter existieren wenn der Scope verlassen wird oder nicht. Und wenn ja, per Kopie oder das Original.

    Du kannst 100GB an Daten in einen std::string schreiben der auf dem Stack liegt ohne dass der Stack explodiert (genug VRAM vorausgesetzt ;)).



  • http://stackoverflow.com/questions/1350819/c-free-store-vs-heap
    Mit den Begriffen ist das auch etwas verwirrend.

    Zu new/delete:
    Google nach:
    RAII



  • Zeus schrieb:

    Skym0sh0 schrieb:

    um stack größen würde ich mir keine sorgen machen, solange man nicht statische arrays der größe xxxtausend macht, sollte das passen. für alles adnere gibt es die STL-Container

    Kellerautomat schrieb:

    Skym0sh0 schrieb:

    wie man rauskriegt wo was liegt

    Da gibts nix rauzukriegen. Die Regeln sind simpel und intuitiv.

    achja?
    pass auf, ich gebe deiner funktion ein objekt und deine funktion sagt mir ob heap oder stack. ok?

    http://www.codeproject.com/Articles/35206/Pointer-pointing-to-Stack-or-Heap :p

    ach weil das ja so plattformunabhängig ist



  • Skym0sh0 schrieb:

    Zeus schrieb:

    Skym0sh0 schrieb:

    um stack größen würde ich mir keine sorgen machen, solange man nicht statische arrays der größe xxxtausend macht, sollte das passen. für alles adnere gibt es die STL-Container

    Kellerautomat schrieb:

    Skym0sh0 schrieb:

    wie man rauskriegt wo was liegt

    Da gibts nix rauzukriegen. Die Regeln sind simpel und intuitiv.

    achja?
    pass auf, ich gebe deiner funktion ein objekt und deine funktion sagt mir ob heap oder stack. ok?

    http://www.codeproject.com/Articles/35206/Pointer-pointing-to-Stack-or-Heap :p

    ach weil das ja so plattformunabhängig ist

    👍
    Das die Funktion gar inline assembler verwendet macht Sie letzten Endes nutzlos.


Anmelden zum Antworten